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の常時接続の際、
セッションで引き回せると、
簡単に値を保持できるという狙いのため。
とはいえ、ポインタのキャスト多いから、大丈夫かはわからん。。
確実な使い方しないと危なそう。。
以上