#include #include #include #include class Measure { struct MeasureConcept { protected: virtual void *getPtr() = 0; public: virtual ~MeasureConcept() = default; template T get() { return *reinterpret_cast(getPtr()); } }; template class MeasureAdapter : public MeasureConcept { T v; public: MeasureAdapter(const T& v) : v(v) {} T get() const { return v; } protected: void *getPtr() override { return &v; } }; std::shared_ptr d; public: template Measure(const T& v) : d(new MeasureAdapter(v)) {} template T get() { return d->get(); } }; int main() { using namespace std::string_literals; std::vector measures; measures.push_back(12); measures.push_back(42.5f); measures.push_back("toto"s); measures.push_back(std::vector{ 1, 2, 3 }); std::cout << measures[0].get() << std::endl; std::cout << measures[1].get() << std::endl; std::cout << measures[2].get() << std::endl; for (auto &v : measures[3].get>()) std::cout << '[' << v << ']' << std::endl; return 0; }