【发布时间】:2011-03-19 02:22:34
【问题描述】:
是否可以在 C++ 中为模板函数的变量定义默认值?
如下所示:
template<class T> T sum(T a, T b, T c=????)
{
return a + b + c;
}
【问题讨论】:
标签: c++ templates default-value
是否可以在 C++ 中为模板函数的变量定义默认值?
如下所示:
template<class T> T sum(T a, T b, T c=????)
{
return a + b + c;
}
【问题讨论】:
标签: c++ templates default-value
试试这个:
template<class T> T sum(T a, T b, T c=T())
{
return a + b + c;
}
如果您期望整数类型并希望默认值为 5,您也可以输入 T(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 )。
【讨论】:
T 完全不兼容的疯狂东西放入其中,只要通过明确的参数就可以了。
是的,您可以定义一个默认值。
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 作为参数。
【讨论】:
是的,只要有一个 T 的构造函数,就可以从你放在那里的任何值开始。鉴于您显示的代码,我假设您可能希望该参数为0。如果你想给构造函数提供多个参数,你可以把T(arg1, arg2, arg3)作为默认值。
【讨论】:
是的!
但是,您至少应该对 T 可能是什么或没用有一个概念。
你不能为函数设置模板参数的默认值,即这是禁止的:
template<typename T=int> void f(T a, T b);
【讨论】: