繁体   English   中英

具有模板构造函数(其他类型)的模板类

[英]templated class with templated constructor (of other type)

是否可以有一个模板化的类,并以其他类型来模板化构造函数?

像这样的东西:

template<typename T1>
class Foo{
    template<typename T2>
    Foo(T1 aBar, T2 dummyArgument){
        bar = aBar;
        bytesOfT2 = sizeof(T2);
    };

    int bytesOfT2;
    T1 bar;
};

这可能吗? 如果是这样,我怎么称呼这样的构造函数? 我需要考虑一些有关头文件和cpp文件的问题吗?

谢谢!

// edit:我的特定示例实际上要复杂得多。 我有

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

是的,一个类模板可以具有一个构造函数模板。 您可以像调用其他任何构造函数一样调用它:

Foo<int> my_foo(42, 0.0);

这将调用T1 = int (因为T1是类模板参数,而类模板参数是int )和T2 = double (因为T2是函数模板参数并从参数0.0推导)来构造函数模板。

必须能够从函数参数中推导出所有模板参数,否则无法调用构造函数模板。 无法为构造函数模板明确指定模板参数。

是的,有可能。 至于调用构造函数,您只需提供一个T1类型的参数和另一个T2类型的参数。 就是这样(除非有人进入有关“呼叫”的术语讨论)。

顺便说一句,而不是第一个默认初始化bar ,然后分配给它,你应该直接初始化它,像

template< class T2 >
Foo( T1 const& aBar, T2 const& dummyArgument )
    : bar( aBar )
    , bytesOfT2( sizeof( T2 ) )
{}

在C ++教科书中查找构造函数和初始化程序。

干杯,……

您还可以使用多种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;
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM