#include <string>
#include <memory>
#include <vector>
class PacketData{
struct Context {
virtual ~Context() = default;
};
template<typename T>
struct Instance : Context {
Instance(T&& t):data_{std::move(t)}{
}
T data_;
};
std::unique_ptr<Context> self_;
public:
template<typename T>
PacketData(T in):self_{new Instance<T>{std::move(in)}}{}
//move is easy, copy is harder ;)
template<typename T>
bool isA(){
return dynamic_cast<Instance<T>*>(self_.get()) != nullptr;
}
template<typename T>
T& asA(){
if(!isA<T>()){
throw std::runtime_error("bad cast or something");
}
return dynamic_cast<Instance<T>*>(self_.get())->data_;
}
};
using Packet = std::vector<PacketData>;
int main() {
Packet packet;
packet.push_back(4);
packet.push_back(4.4f);
packet.push_back(std::string{"test"});
int i = packet[0].asA<int>();
float f = packet[1].asA<float>();
std::string s = packet[2].asA<std::string>();
return 0;
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPHZlY3Rvcj4KCmNsYXNzIFBhY2tldERhdGF7CiAgICBzdHJ1Y3QgQ29udGV4dCB7CiAgICAgICAgdmlydHVhbCB+Q29udGV4dCgpID0gZGVmYXVsdDsKICAgIH07CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgc3RydWN0IEluc3RhbmNlIDogQ29udGV4dCB7CiAgICAgICAgSW5zdGFuY2UoVCYmIHQpOmRhdGFfe3N0ZDo6bW92ZSh0KX17CgogICAgICAgIH0KICAgICAgICBUIGRhdGFfOwogICAgfTsKICAgIHN0ZDo6dW5pcXVlX3B0cjxDb250ZXh0PiBzZWxmXzsKICAgIHB1YmxpYzoKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICBQYWNrZXREYXRhKFQgaW4pOnNlbGZfe25ldyBJbnN0YW5jZTxUPntzdGQ6Om1vdmUoaW4pfX17fQogICAgLy9tb3ZlIGlzIGVhc3ksIGNvcHkgaXMgaGFyZGVyIDspCgogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIGJvb2wgaXNBKCl7CiAgICAgICAgcmV0dXJuIGR5bmFtaWNfY2FzdDxJbnN0YW5jZTxUPio+KHNlbGZfLmdldCgpKSAhPSBudWxscHRyOwogICAgfQogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIFQmIGFzQSgpewogICAgICAgIGlmKCFpc0E8VD4oKSl7CiAgICAgICAgICAgIHRocm93IHN0ZDo6cnVudGltZV9lcnJvcigiYmFkIGNhc3Qgb3Igc29tZXRoaW5nIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkeW5hbWljX2Nhc3Q8SW5zdGFuY2U8VD4qPihzZWxmXy5nZXQoKSktPmRhdGFfOwogICAgfQp9OwoKdXNpbmcgUGFja2V0ID0gc3RkOjp2ZWN0b3I8UGFja2V0RGF0YT47CgppbnQgbWFpbigpIHsKCVBhY2tldCBwYWNrZXQ7CglwYWNrZXQucHVzaF9iYWNrKDQpOwoJcGFja2V0LnB1c2hfYmFjayg0LjRmKTsKCXBhY2tldC5wdXNoX2JhY2soc3RkOjpzdHJpbmd7InRlc3QifSk7CglpbnQgaSA9IHBhY2tldFswXS5hc0E8aW50PigpOwoJZmxvYXQgZiA9IHBhY2tldFsxXS5hc0E8ZmxvYXQ+KCk7CglzdGQ6OnN0cmluZyBzID0gcGFja2V0WzJdLmFzQTxzdGQ6OnN0cmluZz4oKTsKCXJldHVybiAwOwp9