0

クラス「Factory」をテンプレート化しました。factory のプロトタイプは次のようなものです。

template <class T>
class Factory
{
    public:
    Factory();
    ~Factory();

    //few more functions & data-members


    private:
    //few more functions & data-members
};

main() では、次のように複数のタイプのファクトリを作成します --

int main()
{
    typedef Factory<int> IntFactory ;
    IntFactory A = IntFactory();

    typedef Factory<float> FloatFactory ;
    FloatFactory B = FloatFactory();

    //Complex is some user defined class
    typedef Factory<Complex> ComplexFactory ;
    ComplexFactory C = ComplexFactory();

    //Point3D is a user defined class
    typedef Factory<Point3D> Point3DFactory ;
    Point3DFactory D = Point3DFactory();

    //I may have several such initializations.

}

問題は、オブジェクト A、B、C、D の配列を反復処理する場合にどのように作成するかです。

4

3 に答える 3

1

(基本クラスのアプローチを使用したくない場合の代替手段)

typedef boost::variant<IntFactory, FloatFactory, ...>  FactoryType;

std::vector<FactoryType> vFactories;

次に、ビジターを使用してメソッドを実行します...

バリアントのドキュメントをリンクします。

于 2012-09-28T13:55:34.457 に答える
1

あなたができると思う最善のことは(頭のてっぺんから外れてテストされていない)、次のとおりです。

class FactoryBase
{
    public:
        virtual ~FactoryBase() = 0;
};

template <class T>
class Factory : public FactoryBase
{
    //...
};

int main()
{
    std::vector<FactoryBase*> factories;
    factories.push_back(new Factory<int>);
    factories.push_back(new Factory<Complex>);
    //... Make sure you delete these. Better yet, use a smart pointer.
    return 0;
}

vectorポインターの a に注意してください。これらはすべて、push_back(new ...)例外やリークに対して非常に脆弱です...

于 2012-09-28T13:52:42.380 に答える
0

やりたいことを行うには多くの方法があります...それぞれに長所と短所があります...コンパイル時にすべてのインスタンスがわかっている場合、このアプローチはうまく機能します:

含む

#include <boost/fusion/algorithm/iteration/for_each.hpp>
#include <boost/fusion/container/vector.hpp>

ファンクタ

struct do_whatever
{
    template<typename T>
    void operator()(T& t) const
    {
        ...
    }
};

ベクトルに対するインスタンス化と反復

boost::fusion::vector<IntFactory, FloatFactory, ComplexFactory, Point3DFactory> vv(A, B, C, D);
boost::fusion::for_each(vv, do_whatever());
于 2012-09-28T16:18:55.033 に答える