参数类型和计数可以由模板指定

时间:2015-03-14 12:19:07

标签: c++ templates

我希望在常规(非模板)类中有一个函数模板,它使用所需的参数分配派生类并返回指向基类的指针:

class Factory {
public:
    BaseClass_T * createObject(parameters) { return new Derived_T(parameters); }
};

到目前为止,我只使用模板,其中参数的类型不同,但总是相同。由于我的不同派生类具有不同的构造函数签名,我想知道是否有一种方法来模板化并通过模板指定生成的函数的参数类型和计数,如下所示:

Factory f;
f.createObject<Derived1, void>(); // create createObject() for Derivev1() constructor
f.createObject<Derived2, int, double>(); // create createObject() for Derived2(int, double) constructor

1 个答案:

答案 0 :(得分:1)

您可以使用可变参数模板:

#include <utility>

struct BaseClass_T { ~virtual BaseClass_T() = default; };

struct Factory
{
    template <typename Der, typename ...Args>
    BaseClass_T * create(Args &&... args)
    { 
        return new Der(std::forward<Args>(args)...);
    }
};

更好的设计是让您的工厂返回std::unique_ptr<BaseClass_T>

#include <memory>

struct SaneFactory
{
    template <typename Der, typename ...Args>
    std::unique_ptr<BaseClass_T> create(Args &&... args)
    { 
        return std::make_unique<Der>(std::forward<Args>(args)...);
    }
};