2010-07-21 179 views
4

是否可以在C++中为模板函数的变量定义默认值?C++模板函数默认值

类似下面:

template<class T> T sum(T a, T b, T c=????) 
{ 
    return a + b + c; 
} 

回答

8

试试这个:

template<class T> T sum(T a, T b, T c=T()) 
{ 
    return a + b + c; 
} 

你也可以把在T(5)如果你期待一个完整的类型,并希望默认值为5.

0

是的!

但是你至少应该知道T可能是什么或者它是无用的。

你不能设置为功能模板参数的默认值,即该禁止:

template<typename T=int> void f(T a, T b); 
1

是的,那里只需要一个T的构造函数,无论你放在那里的任何值。鉴于你展示的代码,我假设你可能希望这个参数是0。如果您需要构造函数的多个参数,则可以将T(arg1, arg2, arg3)设置为默认值。

5

这一切都取决于您可以对类型进行的假设。

template <typename T> T sum(T a, T b, T c = T()) { return a+b+c; } 
template <typename T> T sum2(T a, T b, T c = T(5)) { return a+b+c; } 

第一种情况,它只假定T是默认可构造的。对于价值初始化(IIRC)且基本上为0的POD类型,因此sum(5, 7)将呼叫sum(5, 7, 0)

在第二种情况下,您需要可以从整数构造类型。对于整数类型,sum(5, 7)将调用sum(5, 7, int(5)),相当于sum(5, 7, 5)

+2

默认参数仅在使用它们时才被实例化。这意味着可以将任何疯狂的东西放入它们中,根本不会与'T'兼容,只要通过明确的论证就没有问题。 – 2010-07-21 18:19:59

2

是的,你可以定义一个默认值。

template <class T> 
T constructThird() 
{ 
    return T(1); 
} 

template <class T> 
T test(T a, 
     T b, 
     T c = constructThird<T>()) 
{ 
    return a + b + c; 
} 

不幸的是constructThird不能把a和b作为参数。