函数模板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)
有很多事情要说:
-
您定义的是函数模板,而不是类模板。由于您使用的是默认模板参数
typename Compare = std::less<Type>
我想您已经在使用C++11了,因为据我所知,函数模板在以前版本的标准中不允许使用默认模板参数。
-
另一方面,像这样的模板参数的默认参数
Compare comp = Compare()
在以前版本的标准中也是可能的。您关于模板化参数不可能使用默认参数的声明是错误的(或者它实际上引用了我在上面所说的默认模板参数)。
-
您收到的编译器错误消息一定是由于其他问题造成的。也许您最终使用的
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
类型。其思想是,调用者可以传递一个函数(或函子),然后该函数将用于比较向量的元素。例如,如果您在函数声明之前定义参数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>() );
}
或者,您可以使用标准算法,避免编写自己的算法。
- 如何使用默认参数等选择模板专业化
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 何时提供默认参数作为模板参数
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 函数不接受 X 参数,函数使用默认参数
- initializer_list具有默认参数的构造函数
- C++ 带有默认参数的结构,可选择在构造函数中更改
- 为什么C++构造函数在继承中需要默认参数?
- 必须非常量别名参数及其默认参数常量
- C++ 默认参数使用其他参数
- 组合函数参数包和默认参数
- 如何定义 Vector2f 的默认参数?[SFML]
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- 如何设置默认参数以防用户不输入另一个参数
- 结构 c++ 中的默认参数
- 构造函数委托与默认参数
- 默认参数和函数指针作为函数参数C++
- 如何在继承层次结构中调用具有默认参数的构造函数?