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

Default argument in function template C++

本文关键字:默认 参数 C++ 函数模板      更新时间:2023-10-16

从我阅读和尝试的内容来看,我不能在函数模板中放置默认参数,对吗?我从我的编译器和其他编译器的响应中获得了很多。。。我这么问是因为我是一个新手,有些更技术性的回答很难理解。这方面有什么办法吗?我正在尝试创建一个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)

有很多事情要说:

  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<> &,因为这似乎更正确):

 

#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>的最大值。

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

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

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