2

ユーザー定義クラスのインスタンスを保持するバリアント型が必要です。だから私は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 つの問題があります。

  1. 動的に割り当てられたメモリへのポインターを含む属性のコピーは危険であり、エラーが発生しやすくなります。
  2. ユーザーは void* を MyClass* ではなく、WrongClass* に static_cast できます。コンパイルはしますが、結果は予測できません。

可能な解決策:

  1. boost::shared_ptr< void* > を使用します。
  2. 内のすべての void* 値 (それらが追加されたとき) の typeid を覚えておいてくださいstd::map<void*, typeid> typeid_map。ユーザーが void* 値を要求し、それを任意の TClass* にキャストしたら、アサーションを評価しましょう: assert(typeid_from_typeid_map == typeid(TClass*)).

質問:
1. ユーザー定義クラスの値を保持する他のソリューションはありますか?
2. 上記の問題に対するより良い解決策をお勧めし、他の問題を指摘していただけますか?

4

1 に答える 1

7

Boost :: Anyを見たことがありますか?これは、Anyを介して実際にどのタイプであるかを隠しながら、タイプのキャストに関するコンパイル時の知識を伴うものです。

于 2011-02-07T14:31:27.570 に答える