如何使用非默认构造函数实例化模板化类

时间:2018-10-27 17:44:57

标签: c++ c++11 templates constructor variadic-templates

请考虑以下示例:

class Generator {
public:
    Generator(int n)
        : m_n(n)
    {
    }

    int f()
    {
        return m_n;
    }
private: 
    int m_n;
};

template<class BaseClass>
class Transformer : public BaseClass
{
public:
    Transformer(int mult, int add)
        : m_mult(mult)
        , m_add(add)
    {

    }

    int f()
    {
        return BaseClass::f() * m_mult + m_add;
    }

private:
    int m_add;
    int m_mult;
};

想象有更多Generator类,它们的构造函数中有不同的参数。现在,我想实例化一个包含所有传递所有必需参数的类。 因此,我尝试了以下操作,但是Generator显然未被识别为基类:

class TG : public Transformer<Generator>
{
public:
    TG(int n, int mult, int add)
        : Generator(n)              // error C2614: 'TG': illegal member initialization: 'Generator' is not a base or member
        , Transformer(mult, add)
    {}
};

TG t(n,mult,add);

接下来,我尝试了模板专门化:

template<> Transformer<Generator>::Transformer(int n, int mult, int add)    // error C2244: 'Transformer<Generator>::Transformer': unable to match function definition to an existing declaration
    : Transformer(mult,add)
    , Generator(n)
{};

Transformer<Generator> t(n,mult,add);

如何实例化具有非默认构造函数的模板?

1 个答案:

答案 0 :(得分:1)

  

想象有更多的Generator类,它们的构造函数中有不同的参数。现在,我想实例化一个包含两个都传递所有必需参数的类

在我看来,如果您至少可以使用C ++ 11,那么您需要的是一个如下编写的可变参数模板构造器

template <typename ... As>
Transformer (int mult, int add, As && ... as)
    : BaseClass{std::forward<As>(as)...}, m_mult{mult}, m_add{add}
 { }

这个想法是,构造函数首先接收所需的成员(m_multm_add)的值,然后接收基类的各种参数列表(具有完美的转发;一般而言是必要的,但很有用)。必须使用此顺序,因为可变参数列表必须位于最后位置。

TG构造函数变为

template <typename ... As>
TG (int mult, int add, As && ... as)
   : Transformer{mult, add, std::forward<As>(as)...}
 { }