Rodhos Soft

備忘録を兼ねた技術的なメモです。Rofhos SoftではiOSアプリ開発を中心としてAndroid, Webサービス等の開発を承っております。まずはご相談下さい。

チュートリアル的な記述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;


}