7

ブーストからptr_mapに自分のクラスオブジェクトを挿入するにはどうすればよいですか。オブジェクトはテンプレート化されているため、マップで静的タイプ名を使用することはできません。だから私はしました:

ptr_map<string, any> someMap;

私のクラスはboost::noncopyableを継承しています。

someMap.insert("Test", new MyClass<SomeTemplate>());

エラーは次のとおりです。エラー:no matching function for call to ‘boost::ptr_map


UPD:ラッパーを作成し、boost::anyは使用しないでください。それで:

class IWrapper { };
class MyClass : public IWrapper { };

ptr_map<string, IWrapper> someMap;
someMap.insert("Test", new MyClass<SomeTemplate>());

なぜそれが機能しないのですか(同じエラー)?継承されたクラスを親インターフェイスに渡すことができます。どうしたの?

4

2 に答える 2

3

これまでのところ、このタイプの問題のほとんどは、共通の基本クラスで解決する必要があります。これは、すべてのクラスが同様に使用される場合です。ランタイムポリモーフィズム。

私は、共通の基本クラスを許可しない正当な理由を見てきました。この場合boost::variant、各アイテムを均一に処理する方法(訪問者)がまだあるため、一般的にサーバーの方が優れています。コンパイル時のポリモーフィズム。

の合法的な使用を見たことがありませんboost::any。ないというわけではありませんが、めったに出会ったことがないほど珍しいです。


そうは言っても、これを試してみてください。

std::map<std::string,boost::any> someMap;
boost::any insanity = new MyClass<SomeTemplate>;
someMap.insert("Test",insanity);

また

boost::ptr_map<std::string,boost::any> someMap;
boost::any* ive_lost_it = new boost::any( new MyClass<SomeTemplate> );
someMap.insert("Test", ive_lost_it );
于 2010-06-17T14:57:43.297 に答える
1

まず、ptr_mapにany*を指定する必要があります。
次に、キーは左辺値である必要があります(例外安全性の問題のため)。

boost::ptr_map<std::string, any> someMap;
any * p = new any(MyClass<Sometype>);
std::string test = "test";
someMap.insert(test, p);


--ラッパークラスを使用している場合は、同じことを編集します。キーは左辺値でなければなりません。

ちなみに、ここでのラッパー/基本クラスの問題は、元のタイプに戻れないことです(そして、テンプレートタイプのために動的ポリモーフィズムもありません)。

于 2010-06-17T15:30:20.563 に答える