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

标签 c++ templates

可以肯定的是,根据我阅读和尝试过的内容,我不能在函数模板中放置默认参数,对吗?我从我的编译器和其他人的回应中学到了很多东西……我问是因为我是新手,一些更技术性的回应很难理解。有解决办法吗?我正在尝试创建一个使用默认关系运算符但可以选择重载的 findmax 函数...即:

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

我想我可以为此创建一个类,但当我真正想要的只是一个函数时,这似乎需要做很多工作...谢谢!

我还应该添加另一个关于我之前看到的问题的问题:

这个函数模板是做什么的,具体来说,(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. 您收到的编译器错误消息一定是由于其他问题引起的。也许 Type你最终使用不适合std::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 类型.这个想法是调用者可以传递一个函数(或仿函数),然后将用于比较 vector 的元素。例如。如果您定义该参数的默认值 OperatorCmp在这样的函数声明之前:

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

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

关于c++ - 函数模板 C++ 中的默认参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9627950/

相关文章:

c++ - 使用数组实现四叉树

c++ - 是否未指定在未评估的上下文中实例化模板/lambda?

c++ - 如何将 vector<T> 解析为模板函数的函数参数?

django - &lt;input type ="text"> django 模板中字符串中的空格

c++ - 为多个列表编写迭代器

c++ - 剪裁线到三角形C++

c++ - 具有继承性的未初始化指针对象

c++ - this 和 const 深入

c++ - 同一个类中的 typedef 变量。这是一个好习惯吗?

c++ - Valgrind 显示 std::vector<> alloc 的次数超过空闲时间,但没有内存泄漏