Baseと呼ばれるポリモーフィックな基本クラスと、Baseから継承するクラスDerived1とDerived2がある場合。次に、boost :: lambdaを使用して、ある種のファクトリを作成できます。何かのようなもの:
typedef boost::function<Base *()> Creator;
std::map<std::string,Creator> map1;
map1["Derived1"] = boost::lambda::new_ptr<Derived1>();
map1["Derived2"] = boost::lambda::new_ptr<Derived2>();
(これは実際のコードではありません。問題を説明しようとしているだけです。)
これは機能するので、文字列を使用してマップ内でルックアップを実行し、次にラムダ関数を呼び出してそのクラスをインスタンス化できます。すべて良い。
これに伴う問題は、生のポインターを扱っていることです。私はスマートポインター(std :: shared_ptr)を使用したいと思います。
だから私がから変更した場合:
typedef boost::function<Base *>() Creator;
に:
typedef boost::function<std::shared_ptr<Base> >() Creator;
それから私はここから立ち往生しています。boost :: lambda::bindをboost::lambda :: new_ptrと組み合わせて使用してみましたが、運が悪く、過去のコンパイルエラーを取得できません。(テンプレート関連のエラー出力の膨大な連なり。)
StackOverflow内の他の同様のメッセージを確認しました。boost::bindとboost::lambda :: new_ptrを使用してshared_ptrコンストラクターを返すのは近いですが、そのソリューションを適用しようとすると、上記のテンプレートエラーが発生します。
サンプルコードと実際のエラーが役立つ場合は喜んで提供しますが、上記の情報で十分であることを願っています。GCC4.6ではboost1.47.0を使用し、Fedora15では4.7スナップショットを使用しています。