繁体   English   中英

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

[英]Default argument in function template C++

只是为了确定,从我读过和尝试的内容来看,我不能在函数模板中放置一个默认参数吗? 我从我的编译器和其他人的反应中选择了那么多......我在问,因为我是一个新手,而且一些更技术性的反应很难理解。 有没有解决这个问题? 我正在尝试创建一个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>() );
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM