ユーザー定義クラスのインスタンスを保持するバリアント型が必要です。だから私はvoid *を使用します:
typedef boost::variant<void*, int, float, std::string> Tvariant;
マップを使用してラッパー クラスを作成しました。
typedef std::map<std::string, Tvariant> Tvalues;
使用例:
int x = 123;
attributes.set("int_var", x);
x = attributes.get<int>("int_var");
MyClass* obj = new MyClass();
attributes.set("void*_var", obj);
obj = static_cast<MyClass*>( attributes.get<void*>("void*_var") );
obj = attributes.cast<MyClass*>("void*_var"); // the same
バリアント クラスのこの void* には 2 つの問題があります。
- 動的に割り当てられたメモリへのポインターを含む属性のコピーは危険であり、エラーが発生しやすくなります。
- ユーザーは void* を MyClass* ではなく、WrongClass* に static_cast できます。コンパイルはしますが、結果は予測できません。
可能な解決策:
- boost::shared_ptr< void* > を使用します。
- 内のすべての void* 値 (それらが追加されたとき) の typeid を覚えておいてください
std::map<void*, typeid> typeid_map
。ユーザーが void* 値を要求し、それを任意の TClass* にキャストしたら、アサーションを評価しましょう:assert(typeid_from_typeid_map == typeid(TClass*))
.
質問:
1. ユーザー定義クラスの値を保持する他のソリューションはありますか?
2. 上記の問題に対するより良い解決策をお勧めし、他の問題を指摘していただけますか?