代码之家  ›  专栏  ›  技术社区  ›  MBZ

C++模板函数缺省值

  •  6
  • MBZ  · 技术社区  · 14 年前

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

    如下所示:

    template<class T> T sum(T a, T b, T c=????)
    {
         return a + b + c;
    }
    
    5 回复  |  直到 7 年前
        1
  •  10
  •   Peter Mortensen mkoryak    7 年前

    试试这个:

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

    如果您希望使用整型,并且希望默认值为5,那么也可以输入t(5)。

        2
  •  7
  •   Bill    14 年前

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

    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 如此 sum( 5, 7 ) 将呼叫 sum( 5, 7, 0 ) .

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

        3
  •  2
  •   computinglife    14 年前

    是的,可以定义默认值。

    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
  •  1
  •   Phil Miller    14 年前

    是的,只需要一个构造函数 T 从你所赋予的任何价值。考虑到您显示的代码,我想您可能希望该参数是 0 . 如果您想要对构造函数使用多个参数,可以将 T(arg1, arg2, arg3) 作为默认值。

        5
  •  0
  •   Peter Mortensen mkoryak    7 年前

    对!

    然而,你至少应该知道什么是T,或者它是无用的。

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

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