チュートリアル的な記述7
typeerase的なものを作ってみたがポインタ周りが怪しいので修正中
#include "TypeErase.hpp" #include <iostream> #include <map> class AnyBase; using AnyBase_sp = std::shared_ptr<AnyBase>; class AnyBase { public: AnyBase() = default; virtual ~AnyBase() = default; template<typename T> T get(); static AnyBase_sp make(std::string x); static AnyBase_sp make(int x); }; template <typename T> class Any; template <typename T> using Any_sp = std::shared_ptr<Any<T>>; template <typename T> class Any : public AnyBase { public: Any(std::string x) : hold(x){}; Any(int x): hold(x){}; ~Any() {}; T hold; static Any_sp<T> make(std::string x) { auto r = std::make_shared<Any<T>>(x); return r; } }; template <typename T> T AnyBase::get() { return dynamic_cast<Any<T>*>(this)->hold; } AnyBase_sp AnyBase::make(std::string x) { auto a = std::make_shared<Any<decltype(x)>>(x); return a; } AnyBase_sp AnyBase::make(int x) { auto a = std::make_shared<Any<decltype(x)>>(x); return a; } class Storage { public: Storage() = default; ~Storage() = default; }; void useTypeTrace() { AnyBase_sp xx = AnyBase::make("xxxxx"); AnyBase_sp yy = AnyBase::make(33333); // std::cout << "typeErase " << x->get<int>() << std::endl; std::cout << "typeErase " << xx->get<std::string>() << std::endl; std::cout << "typeErase " << yy->get<int>() << std::endl; }