0

Aから派生した複数のクラスがあります

class A : public boost::enable_shared_from_this<A> {
    public:
        typedef boost::shared_ptr<A>    pointer;

        static pointer create(tcp::socket& socket) {
            return pointer(new A(socket));
        }
    private:
        A(&tcp::socket socket) : m_socket(socket) {}

        tcp::socket&    m_socket;
}

Class Aa : public A {
    public:
        typedef boost::shared_ptr<Aa>   pointer;

        static pointer create(tcp::socket& socket) {
            return pointer(new Aa(socket));
        }

    private:
        Aa(&tcp::socket socket) : A(socket) {}
}

Class Ab : public A {
    public:
        typedef boost::shared_ptr<Ab>   pointer;

        static pointer create(tcp::socket& socket) {
            return pointer(new Ab(socket));
        }

    private:
        Ab(&tcp::socket socket) : A(socket) {}
}

[...]

Class Ax : public A {
    public:
        typedef boost::shared_ptr<Ax>   pointer;

        static pointer create(tcp::socket& socket) {
            return pointer(new Ax(socket));
        }

    private:
        Ax(&tcp::socket socket) : A(socket) {}
}

boost :: factoryを使用してファクトリパターンを作成したいと思います。私はそのようなものを書きました:

class MyFactory {
    public:
        static MyFactory* getInstance();

        typedef boost::function< A(tcp::socket) > a_fact;

    private:
        MyFactory() {
            map["Aa"] = boost::bind(boost::factory< Aa::create >, _1);
            map["Ab"] = boost::bind(boost::factory< Ab::create >, _1);
            […]
            map["Ax"] = boost::bind(boost::factory< Ax::create >, _1);
        }

        std::map<std::string, a_fact>   map;
    };

そしてもちろん、それはコンパイルされません...私にエラーを与えます:

MyFactory.cc:13: error: type/value mismatch at argument 1 in template parameter list for ‘template<class Pointer, class Allocator, boost::factory_alloc_propagation AP> class boost::factory’
MyFactory.cc:13: error:   expected a type, got ‘Aa::create’

任意のアイデア、どのように実装すればよいですか?

4

2 に答える 2

0

ドキュメントでは、-templateに渡される引数は、factory結果として期待されるポインタタイプです。だからあなたの場合boost::factory<Aa::pointer>

于 2011-05-12T11:45:33.980 に答える
0

誰かが同じ間違いを犯した場合、ここに答えがあります。動作する必要はなく、直接boost::factory使用するだけで十分です。boost::function

それで

class MyFactory {
    public:
        static MyFactory* getInstance();

        typedef boost::function< A(tcp::socket) > a_fact;

    private:
        MyFactory() {
            map["Aa"] = boost::bind(&Aa::create, _1);
            map["Ab"] = boost::bind(&Ab::create, _1);
            […]
            map["Ax"] = boost::bind(&Ax::create, _1);
        }

        std::map<std::string, a_fact>   map;
    };

よく働く !!!

于 2011-05-13T14:06:27.947 に答える