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

MCP*_*MCP 9 c++ templates

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

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

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

关于我以前见过的事情,我还应该补充一个问题:

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

template <typename ElemType>
  ElemType FindMax(Vector<ElemType> &v, int (cmpFn)(ElemType, ElemType) = OperatorCmp)
Run Code Online (Sandbox Code Playgroud)

jog*_*pan 8

有很多话要说:

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

    typename Compare = std::less<Type>

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

  2. 另一方面,模板参数的默认参数是这样的

    Compare comp = Compare()

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

  3. 您收到的编译器错误消息必须是由于某些其他问题.也许Type你最终使用不顺利std::less,或者Compare你使用的类型没有实现默认的构造函数.在任何情况下,以下程序都在GCC 4.6.2上编译(注意我更改了std::vector<> &to,const std::vector<> &因为它似乎更正确):

 

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

这声明了一个函数参数,即一个本身就是函数的参数.声明

int (cmpFn)(ElemType, ElemType)
Run Code Online (Sandbox Code Playgroud)

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

int OperatorCmp(int a, int b) {
  return (a<b?-1:(a>b?1:0));
}
Run Code Online (Sandbox Code Playgroud)

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


Dav*_*eas 5

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

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

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