Вы можете использовать std::shared_pointer
или std::unique_ptr
(в зависимости от вашего использования), и поэтому вектор будет выглядеть следующим образом:
std::vector<std::pair<int, std::shared_pointer<PacketBase>>> m_vPacketData;
И тогда метод addValue
должен выглядеть вот так:
void addValue(int n, const PacketBase& packetData)
{
m_vPacketData.emplace_back(
std::make_pair(
n,
std::make_shared<PacketBase>(packetData)
)
);
}
Это создаст копию packetData
в куче и сохранит ссылку в общем указателе. Если вы не знаете, что делать с этой копией, вам необходимо определить новый конструктор в PacketBase
class PacketBase{
public:
PacketBase(PacketBase&& el): attr(std::move(el.attr))... {...}
}
, а затем переопределить addValue
, который принимает ссылку на rvalue
void addValue(int n, PacketBase&& packetData)
{
m_vPacketData.emplace_back(
std::make_pair(
n,
std::make_shared<PacketBase>(std::move(packetData))
)
);
}
А затем вызов правого addValue
из main
:
for ( int nIdx = 0; nIdx < 5; ++nIdx )
{
PacketVal<std::string> pp(strAAA);
packet.addValue(nIdx + 1, std::move(pp));
}
Или на самом деле просто:
for ( int nIdx = 0; nIdx < 5; ++nIdx )
packet.addValue(nIdx + 1, PacketVal<std::string>(strAAA););
Это, очевидно, заставит вас переписать весь класс , потому что вы меняете тип атрибута ... Другой способ добиться этого - переключиться с
m_vPacketData.emplace_back(std::make_pair(n, &packetData));
на
m_vPacketData.emplace_back(std::make_pair(n, new PacketVal(packetData)));
Но вы должны не забыть удалить объекты в куче или будут утечки памяти