如何使用非默认构造函数实例化模板化类
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
类,它们的构造函数中有不同的参数。现在,我想实例化一个类,该类由传递所有必需参数的二者组成。所以我尝试了以下操作,但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);
如何实例化具有非默认构造函数的模板?
Imaging有更多的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_mult
和m_add
(的值,然后是基类的可变参数列表(具有完美的转发;不必要,但通常来说可能有用(。这个顺序是必要的,因为推导参数的可变列表必须在最后一个位置。
TG
构造函数变为
template <typename ... As>
TG (int mult, int add, As && ... as)
: Transformer{mult, add, std::forward<As>(as)...}
{ }
相关文章:
- 为什么std::vector和std::valarray初始化构造函数不同
- 我应该在C++中将这些结构用作参数化构造函数吗?
- 将显式实例化的函数模板与转换匹配
- 为什么即使我调用参数化构造函数也会调用默认构造函数?
- 使用向量初始化参数化构造函数的对象数组
- 初始化构造函数C++中结构的向量
- 我们可以用参数化构造函数初始化结构的数组吗?
- 以下代码如何工作以每次为唯一调用堆栈唯一实例化模板函数?
- 如何同时别名和实例化模板函数?
- 如何在其他类中使用参数化构造函数制作类的对象?
- C++ 中常量属性的初始化构造函数错误
- 引入参数化构造函数后显示 LNK 2019 未解析外部符号的代码错误
- 如何执行参数化构造函数的调用?
- 为什么我不能在类中使用参数化构造函数?
- 如何在 QML 中实例化C++组件 - WITH 参数化构造函数
- C++如何用参数化构造函数实例化对象
- 基于运行时类型实例化构造函数
- 模板类的模板化构造函数的显式实例化
- 类模板的显式实例化没有实例化构造函数
- 初始化实例的构造函数内的静态成员