diff --git a/C++/typeerasure b/C++/typeerasure deleted file mode 160000 index 5c7eb28..0000000 --- a/C++/typeerasure +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 5c7eb2826ce6b63a6372c0a0b8602a30bc7f82c8 diff --git a/C++/typeerasure/measure.cpp b/C++/typeerasure/measure.cpp new file mode 100644 index 0000000..c8dabf0 --- /dev/null +++ b/C++/typeerasure/measure.cpp @@ -0,0 +1,49 @@ +#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; +}