如何使用非默认构造函数实例化模板化 class
How to instantiate a templated class with non-default constructors
请考虑以下示例:
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
classes,它们在构造函数中有不同的参数。现在我想实例化一个 class ,其中包含传递所有必需的参数。
所以我尝试了以下方法,但 Generator
显然不被识别为基础 class:
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);
如何实例化具有非默认构造函数的模板?
Imaging there are more Generator classes, which have different arguments in their constructors. Now I want to instantiate a class consisting of both passing all the required parameters
在我看来,如果你至少会使用C++11,你需要的是一个可变模板构造函数,如下所示
template <typename ... As>
Transformer (int mult, int add, As && ... as)
: BaseClass{std::forward<As>(as)...}, m_mult{mult}, m_add{add}
{ }
这个想法是,构造函数首先接收成员的值(m_mult
和 m_add
),然后是基 class 的可变参数列表(完美转发;不是必需的,但一般来说很有用)。这个顺序是必要的,因为推导参数的可变列表必须在最后位置。
TG
构造函数变为
template <typename ... As>
TG (int mult, int add, As && ... as)
: Transformer{mult, add, std::forward<As>(as)...}
{ }
请考虑以下示例:
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
classes,它们在构造函数中有不同的参数。现在我想实例化一个 class ,其中包含传递所有必需的参数。
所以我尝试了以下方法,但 Generator
显然不被识别为基础 class:
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);
如何实例化具有非默认构造函数的模板?
Imaging there are more Generator classes, which have different arguments in their constructors. Now I want to instantiate a class consisting of both passing all the required parameters
在我看来,如果你至少会使用C++11,你需要的是一个可变模板构造函数,如下所示
template <typename ... As>
Transformer (int mult, int add, As && ... as)
: BaseClass{std::forward<As>(as)...}, m_mult{mult}, m_add{add}
{ }
这个想法是,构造函数首先接收成员的值(m_mult
和 m_add
),然后是基 class 的可变参数列表(完美转发;不是必需的,但一般来说很有用)。这个顺序是必要的,因为推导参数的可变列表必须在最后位置。
TG
构造函数变为
template <typename ... As>
TG (int mult, int add, As && ... as)
: Transformer{mult, add, std::forward<As>(as)...}
{ }