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

问题描述 投票:0回答:5

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

如下所示:

template<class T> T sum(T a, T b, T c=????)
{
     return a + b + c;
}
c++ templates default-value default-arguments
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
是默认可构造的。对于值初始化(IIRC)的 POD 类型,基本上是
0
,因此
sum( 5, 7 )
将调用
sum( 5, 7, 0 )

在第二种情况下,您要求可以从整数构造类型。对于整数类型,

sum( 5, 7 )
将调用
sum( 5, 7, int(5) )
,相当于
sum( 5, 7, 5 )


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);
© www.soinside.com 2019 - 2024. All rights reserved.