【问题标题】:C++ template function default valueC++模板函数默认值
【发布时间】: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


    【解决方案1】:

    试试这个:

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

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

    【讨论】:

      【解决方案2】:

      这完全取决于您可以对类型做的假设。

      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 完全不兼容的疯狂东西放入其中,只要通过明确的参数就可以了。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        是的,只要有一个 T 的构造函数,就可以从你放在那里的任何值开始。鉴于您显示的代码,我假设您可能希望该参数为0。如果你想给构造函数提供多个参数,你可以把T(arg1, arg2, arg3)作为默认值。

        【讨论】:

          【解决方案5】:

          是的!

          但是,您至少应该对 T 可能是什么或没用有一个概念。

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

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

          【讨论】:

            猜你喜欢
            • 2011-03-27
            • 2011-03-18
            • 2015-07-08
            • 2016-03-01
            • 2012-03-26
            • 1970-01-01
            • 2018-07-15
            • 2015-05-09
            • 2013-09-29
            相关资源
            最近更新 更多