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