std::unorderd_mapになんでも入れてみた。

とりあえずコード。

 

class Session
{
private:
    std::unordered_map<std::string, std::shared_ptr<void>> values;

public:
    template <typename T>
    bool getValue(const std::string &name, T *value)
    {
        std::shared_ptr<void> data = values[name];
        if (data != nullptr) {
            void* raw = data.get();
            *value = *((T*) raw);
            return true;
        }
        return false;
    }

    template <typename T>
    void setValue(const std::string &name, T *value)
    {
        values.emplace(std::make_pair(name, std::make_shared<T>(*value)));
    }
};

struct STest
{
    int m1;
    std::string m2;
};

int main()
{
    STest t1{2, "hoge"};
    Session s;
    s.setValue<STest>("key", &t1);

    STest t2;
    if (s.getValue<STest>("key", &t2)) {
        std::cout << "m1:" << t2.m1 << ", m2:" << t2.m2 << std::endl; // 2, hoge
    }
}

 

となる。

コンテナから引き出す時に、無駄に1回生成が走るから、

大きいインスタンスでは注意が必要。

 

で、なぜこれをつくるかというと、

例えばTCPの常時接続の際、

セッションで引き回せると、

簡単に値を保持できるという狙いのため。

 

とはいえ、ポインタのキャスト多いから、大丈夫かはわからん。。

確実な使い方しないと危なそう。。

 

以上