函数模板:默认类型参数

Function template: default type parameter

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

我正在完成加速c++中的练习,目前正在编写有关泛型函数的章节。我遇到了一个我想写的算法,我想它需要给定迭代器的value_type。我遇到了这个函数模板的后默认模板参数,这帮了我很多忙,但我想知道我的方法是否正确。如果真的是这样的话,我不想养成坏习惯。

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类型参数的语法是如何工作的?我不太明白把一个类型当作函数来调用是如何产生类似替代的效果的。谢谢你抽出时间。我真的很感激。

BinaryOp op = BinaryOp()是从默认构造的临时复制初始化BinaryOp的实例。默认模板参数是std::greater,它是由BinaryOp别名的默认类型。在任何类类型上使用()都会导致构造函数调用。在这段代码中,您将创建一个类型为std::greater的默认参数。

接下来,在调用op()的地方,实际上是在调用一个成员运算符bool operator()(const value_type&, condt value_type&)。这使得op可以像函数对象一样工作。