#include #include "common/log.h" #pragma once namespace paddle_mobile { template struct IDToType { typedef Type type_t; }; template struct VariantHelper { static const size_t size = sizeof(F) > VariantHelper::size ? sizeof(F) : VariantHelper::size; inline static void Destroy(size_t id, void *data) { if (id == typeid(F).hash_code()) { reinterpret_cast(data)->~F(); } else { VariantHelper::Destroy(id, data); } } }; template struct VariantHelper { static const size_t size = sizeof(F); inline static void Destroy(size_t id, void *data) { if (id == typeid(F).hash_code()) { // reinterpret_cast(data)->~F(); } else { // std::cout << "未匹配到 " << std::endl; } } }; template class RawData { public: char data[size]; RawData() {} RawData(const RawData &raw_data) { strcpy(data, raw_data.data); } // void operator=(const RawData &raw_data){ // strcpy(data, raw_data.data); // } }; template struct Variant { Variant(const Variant &variant) { // std::cout << " 赋值构造函数 " << std::endl; type_id = variant.type_id; data = variant.data; } Variant() : type_id(invalid_type()) {} ~Variant() { // helper::Destroy(type_id, &data); } template void Set(Args &&... args) { helper::Destroy(type_id, &data); new (&data) T(std::forward(args)...); type_id = typeid(T).hash_code(); } template T &Get() const { if (type_id == typeid(T).hash_code()) { return *const_cast(reinterpret_cast(&data)); } else { // std::cout << " bad cast in variant " << std::endl; throw std::bad_cast(); } } size_t TypeId() const { return type_id; } private: static inline size_t invalid_type() { return typeid(void).hash_code(); } typedef VariantHelper helper; size_t type_id; RawData data; }; template struct Vistor { typedef T type_t; }; } // namespace paddle_mobile