函数模板C ++中的默认参数

时间:2012-03-09 01:59:45

标签: c++ templates

只是为了确定,从我读过和试过的内容来看,我不能在函数模板中放置一个默认参数吗?我从我的编译器和其他人的反应中选择了那么多......我在问,因为我是一个新手,而且一些更技术性的反应很难理解。有没有解决这个问题?我正在尝试创建一个findmax函数,它使用默认的关系运算符,但可以选择重载...即:

template <typename Type, typename Compare = std::less<Type> >
Type FindMax(std:vector<Type> &vec, Compare comp = Compare()) {
    return *std::max_element(...
}

我想我可以为此做一个课程,但是当我真正想要的只是一个功能时似乎很多工作......谢谢!

我还应该添加另一个问题,我以前见过的事情:

这个函数tempate做了什么,具体来说,(cmpFn)...)默认参数是做什么的?

template <typename ElemType>
  ElemType FindMax(Vector<ElemType> &v, int (cmpFn)(ElemType, ElemType) = OperatorCmp)

2 个答案:

答案 0 :(得分:8)

有很多话要说:

  1. 您定义的是功能模板,而不是类模板。由于您使用的是默认模板参数

    typename Compare = std::less<Type>

    我认为你已经在使用C ++ 11,因为我知道所有功能模板都不允许在以前的标准版本中使用默认模板参数。

  2. 另一方面,像

    这样的模板参数的默认参数

    Compare comp = Compare()

    也可以在之前版本的标准中使用。您对模板化参数无法使用默认参数的说法是错误的(或者实际上它可能是指上面我称之为默认模板参数的内容)。

  3. 您收到的编译器错误消息必须是由于其他一些问题。也许您最终使用的Typestd::less不相符,或者您使用的Compare类型未实现默认构造函数。在任何情况下,以下程序都在GCC 4.6.2上进行编译(请注意,我将std::vector<> &更改为const std::vector<> &,因为这似乎更正确了):

  4. #include <vector>
    #include <functional>
    #include <algorithm>
    
    template <typename Type, typename Compare = std::less<Type> >
    Type FindMax(const std::vector<Type> &vec, Compare comp = Compare()) {
      return *std::max_element(vec.begin(),vec.end(),comp);
    }
    
    int main() {
      FindMax(std::vector<int>());
      return 0;
    }
    

    确实这需要-std=C++0x选项,但这是因为默认模板参数,而不是默认参数。

    关于与cmpFn相关的额外问题:

    声明函数参数,即一个本身就是函数的参数。声明

    int (cmpFn)(ElemType, ElemType)
    

    表示函数的本地名称为cmpFn,其返回类型为int,并且它采用两个类型ElemType的参数。这个想法是调用者可以传递一个函数(或函子),然后用它来比较向量的元素。例如。如果你在函数声明之前定义该参数OperatorCmp的默认值,如下所示:

    int OperatorCmp(int a, int b) {
      return (a<b?-1:(a>b?1:0));
    }
    

    声明变为有效,您可以使用它来查找std::vector<int>的最大值。

答案 1 :(得分:5)

你可以在C ++ 11中做到这一点。从C ++ 03开始,您可以通过创建具有不同数量的参数的两个重载并从一个参数转发到另一个来轻松解决它。

template <typename Type>
Type findMax( std::vector<Type> const & v ) {
   return findMax( v, std::less<Type>() );
}

或者,您可以使用标准算法,避免编写自己的算法。