我正在研究加速c ++中的练习,目前我正在研究有关泛型函数的章节。我遇到了一个我想要编写的算法,我认为它需要给定迭代器的value_type。我遇到了这篇文章Default template arguments for function templates,这对我有很大帮助,但我想知道我的方法是否正确。如果情况确实如此,我不想养成坏习惯。
template <class ForwardIt, class BinaryOp = std::greater<std::iterator_traits<ForwardIt>::value_type> >
ForwardIt maxInRange(ForwardIt begin, ForwardIt end, BinaryOp op = BinaryOp()) {
// test here to reduce the loop count by 1
if (begin == end)
return begin;
ForwardIt largest = begin;
while (++begin != end)
if (op(*begin, *largest))
largest = begin;
return largest;
}
还有一个问题,抱歉。关于BinaryOp类型参数的语法如何工作?我不太明白如何调用一个类型就好像它是一个函数会产生类似替代的效果。谢谢你的时间。对此,我真的非常感激。
答案 0 :(得分:2)
BinaryOp op = BinaryOp()
从默认构造的临时文件中复制初始化BinaryOp
的实例。默认模板参数为std::greater
,这是BinaryOp
别名的默认类型。在任何类类型上使用()
会导致构造函数调用。在此代码中,您将创建类型为std::greater
的默认参数。
接下来,在调用op()
的地方,您实际上正在调用成员运算符bool operator()(const value_type&, condt value_type&)
。这允许op
像一个函数对象。