是否可以使用模板化类并使用其他类型模板化构造函数?
类似的东西:
template<typename T1>
class Foo{
template<typename T2>
Foo(T1 aBar, T2 dummyArgument){
bar = aBar;
bytesOfT2 = sizeof(T2);
};
int bytesOfT2;
T1 bar;
};
这可能吗?如果是这样,我怎么称呼这样的构造函数?我是否需要考虑有关header和cpp文件的内容?
谢谢!
//编辑:我的特定例子实际上甚至有点复杂。我有
template <typename U1, U2>
class Foo{
U1 var1;
U2 var2;
};
template <typename T1>
class Bar{
template<typename T2, typename T3>
Bar(Foo<T2,T3> aFoo, T1 aVal){
val=aVal;
bytesOfT2=sizeof(T2);
bytesOfT3=sizeOf(T3);
};
int bytesOfT2;
int bytesOfT3;
T1 val;
};
这是否意味着我可以在这里使用Foo类型的任何变量调用构造函数,它应该根据特定版本的Foo自动选择正确的构造函数(例如,如果我传递的变量是Foo类型,它应该自动设置T2为bool而T3为浮动)?
答案 0 :(得分:8)
是的,类模板可以有一个构造函数模板。你可以像调用任何其他构造函数一样调用它:
Foo<int> my_foo(42, 0.0);
这将使用T1 = int
调用构造函数模板(因为T1
是类模板参数,而类模板参数是int
)和T2 = double
(因为T2
是函数模板参数,从参数0.0
推导出来。
必须能够从函数参数推导出所有模板参数,否则无法调用构造函数模板。无法显式指定构造函数模板的模板参数。
答案 1 :(得分:1)
是的,这是可能的。至于调用构造函数,您只需提供一个类型为T1
的参数和一个类型为T2
的第二个参数。就是这样(除非有人进入关于“召唤”的术语讨论)。
顺便说一下,您应该直接初始化它,而不是首先默认初始化bar
然后分配给它,比如
template< class T2 >
Foo( T1 const& aBar, T2 const& dummyArgument )
: bar( aBar )
, bytesOfT2( sizeof( T2 ) )
{}
在C ++教科书中查找构造函数和初始值设定项。
干杯&amp;第h。,
答案 2 :(得分:0)
您还可以使用多个template type
:
template<typename T1, typename T2>
class Foo{
public:
Foo(T1 aBar, T2 dummyArgument){
bar = aBar;
bytesOfT2 = sizeof(T2);
}
private:
int bytesOfT2;
T1 bar;
};