2010-10-21 149 views
0

是否有可能有模板化类,还可以使用某种其他类型对构造函数进行模板化?使用模板化构造函数(其他类型)的模板类

是这样的:

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

    int bytesOfT2; 
    T1 bar; 
}; 

这可能吗?如果是的话,我会如何调用这样的构造函数?我是否需要考虑有关标题和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类型的任何变量,它会自动选择合适的构造acording到富的特定版本(例如,如果我传递变量是请键入Foo,它应该自动将T2设置为布尔型,T3将自动设置为浮点型)?

+0

你说的意思是“我需要考虑的头部和cpp文件的方面的东西吗?” – 2010-10-21 00:10:11

+0

mmmh - 由于某些原因(我不记得),有时我不得不放置一行,如“模板类Foo ;”到cpp文件中,如果我想要能够使用具有模板类型bool的Foo类。 (所以我需要为模板类使用的每种类型都做到这一点) – Mat 2010-10-21 00:12:45

+0

啊。您可以阅读[C++ FAQ Lite](http://www.parashift.com/c++-faq-lite/templates.html#faq-35.12)中的原因(该条目和以下条目讨论“问题”以及如何解决问题;实际上,通常最好在头文件中实现整个模板)。 – 2010-10-21 00:17:46

回答

8

是的,类模板可以有一个构造函数模板。你怎么称呼它,你会调用任何其它构造:

Foo<int> my_foo(42, 0.0); 

此调用与T1 = int构造函数模板(因为T1是一个类模板参数和类模板参数是int)和T2 = double(因为T2是一个函数模板参数并且从参数0.0推导出)。

所有模板参数都必须能够从函数参数中推导出来,否则无法调用构造函数模板。没有办法显式指定构造函数模板的模板参数。

+0

啊!所以我实际上可以传递一个任意变量作为第二个参数,编译器会自动为我生成适当的构造函数版本?我甚至不必提及<>括号内的类型? – Mat 2010-10-21 00:09:48

+0

@Mat:是的。正如其他函数模板一样,构造函数模板的参数推导也会发生。 – 2010-10-21 00:11:04

+0

如果我提供了一个类型化的变量Foo作为参数,那么我的扩展示例(参见上文)会如何选择合适的“子类型”? – Mat 2010-10-21 00:19:40

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; 
}; 
+0

我不想要这个,我只想要构造函数是另一个变量类型 – Mat 2010-10-21 00:18:48

+0

@Mat:我在回复时没有得到。 :( – Donotalo 2010-10-21 01:54:44

1

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

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

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

查找在你的C++教科书构造函数和初始化。

干杯&心连心,

+0

啊 - 我不知道我可以在初始化列表中使用表达式 - 谢谢! – Mat 2010-10-21 00:21:41

相关问题