如何使用模板参数类型T来指定默认函数参数

11
在C++中,是否可以为模板函数的变量定义默认值?
类似下面的方式:
template<class T> T sum(T a, T b, T c=????)
{
     return a + b + c;
}
5个回答

12

试试这个:

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

如果您期望一个整型并且希望默认值为5,您也可以输入T(5)。


7

一切都取决于您对类型所做的假设。

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是默认可构造的。对于POD类型,这是值初始化(如果我没记错的话),基本上是0,因此sum( 5, 7 )将调用sum( 5, 7, 0 )
在第二种情况中,您需要该类型可以从整数构造。对于整数类型,sum( 5, 7 )将调用sum( 5, 7, int(5) ),这等同于sum( 5, 7, 5 )

3
如果默认参数没有被使用,它们就不会被实例化。这意味着,只要传递了一个显式参数,就可以将任何与“T”不兼容的东西放入其中,这并不会有问题。换句话说,默认参数只在需要时才会被使用。 - Johannes Schaub - litb

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作为参数。


1
是的,只需要有一个从您放置的任何值创建T的构造函数。根据您显示的代码,我假设您可能希望该参数为0。如果要将多个参数传递给构造函数,则可以将T(arg1,arg2,arg3)作为默认值。

0

是的!

但是你至少应该对 T 是什么有一个概念,否则它就没有用了。

你不能为函数的模板参数设置默认值,也就是说,这是被禁止的:

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

更新 - C++11 允许这样做。 - 10762409

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接