c++ - shared_ptrでラムダをブーストする

c++ boost-lambda

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内の他の同様のメッセージを確認しましたが、Using boost::bind and boost::lambda::new_ptr to return a shared_ptr constructorは閉じていますが、その解決策を適用しようとすると、上記のテンプレートエラーが発生します。

参考になれば、サンプルコードと実際のエラーを提供させていただきますが、上記の情報で十分です。 GCC 4.6でboost 1.47.0を使用し、Fedora 15で4.7スナップショットを使用しています。
答え
class Base { 
public:
    virtual ~Base() = 0;
};
Base::~Base() {}

class Derived1 : public Base {};
class Derived2 : public Base {};

typedef boost::shared_ptr<Base> BasePtr;

typedef boost::function<BasePtr()> Creator;
template <typename T>
Creator MakeFactory()
{
    namespace la = boost::lambda;
    return la::bind( 
        la::constructor<BasePtr>(), 
        la::bind(la::new_ptr<T>()));
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::map<std::string,Creator> map1;    
    map1["Derived1"] = MakeFactory<Derived1>();
    map1["Derived2"] = MakeFactory<Derived2>();
    BasePtr p1 = map1["Derived1"]();
    BasePtr p2 = map1["Derived2"]();

    return 0;
}


しかし、なぜあなたが書くことができるときにトラブルに行くのですか?

template <typename T>
BasePtr MakeFactoryImpl()
{
    return BasePtr(new T());
}
template <typename T>
Creator MakeFactory()
{
    return Creator(&MakeFactoryImpl<T>);
}
関連記事

c++ - C++ / CLIを使用したネイティブC++テンプレートクラスのラップ

c++ - C++でページのコンテンツを取得する

c++ - アプリケーションにフォーカスがない場合のキープレスの検出

c++ - BOOST ASIO:Windowsで「bind:Address already in use」を取得しないのはなぜですか(ただし、Linuxで取得します)?

c++ - ビル印刷ジョブ

c++ - 文字列ストリームからファイルにデータを書き込む方法(CPP)

c++ - utf 8の2つの文字列の比較が正しくないのはなぜですか?

c++ - 十分に文書化されたオープンソースおよび高速C / C++画像操作ライブラリ。 「サイズ変更」のように、回転、色の変更、切り抜き[終了]

c++ - 重複するQGraphicsItem-sホバーイベント

c++ - 数値データをchar *にシリアル化する方法