带模板化构造函数的模板化类(其他类型)

时间:2010-10-21 00:04:30

标签: c++ templates constructor

是否可以使用模板化类并使用其他类型模板化构造函数?

类似的东西:

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为浮动)?

3 个答案:

答案 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;
};