首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建多个模板对象的数组

如何创建多个模板对象的数组
EN

Stack Overflow用户
提问于 2012-09-28 21:43:18
回答 3查看 1.9K关注 0票数 0

我有一个模板类"Factory“。工厂的原型如下所示:

代码语言:javascript
复制
template <class T>
class Factory
{
    public:
    Factory();
    ~Factory();

    //few more functions & data-members


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

在main()中,我创建了多种类型的工厂,如--

代码语言:javascript
复制
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,我该如何创建它们的数组?

EN

回答 3

Stack Overflow用户

发布于 2012-09-28 21:52:42

我认为你能做的最好的事情,(在我的脑海中没有经过测试)是:

代码语言:javascript
复制
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,所有的push_back(new ...)内容都非常容易受到异常和泄漏的影响……

票数 1
EN

Stack Overflow用户

发布于 2012-09-28 21:55:34

(如果您不想使用基类方法,也可以选择)

代码语言:javascript
复制
typedef boost::variant<IntFactory, FloatFactory, ...>  FactoryType;

std::vector<FactoryType> vFactories;

然后使用访问器执行和方法...

链接variant的文档。

票数 1
EN

Stack Overflow用户

发布于 2012-09-29 00:18:55

有很多方法可以做你想做的.每一个都有利弊...如果您知道编译时的所有实例,这种方法可以很好地工作:

包括

代码语言:javascript
复制
#include <boost/fusion/algorithm/iteration/for_each.hpp>
#include <boost/fusion/container/vector.hpp>

函数器

代码语言:javascript
复制
struct do_whatever
{
    template<typename T>
    void operator()(T& t) const
    {
        ...
    }
};

向量上的实例化和迭代

代码语言:javascript
复制
boost::fusion::vector<IntFactory, FloatFactory, ComplexFactory, Point3DFactory> vv(A, B, C, D);
boost::fusion::for_each(vv, do_whatever());
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12641207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档