2014-09-02 131 views
1

我正在通過加速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

關鍵是' operator()(一些參數...);' – user3159253 2014-09-02 04:27:06

回答

2

BinaryOp op = BinaryOp()從默認構建的臨時文件複製初始化BinaryOp的實例。默認模板參數是std::greater,這是BinaryOp別名的默認類型。對任何類類型使用()會導致構造函數調用。在此代碼中,您正在創建std::greater類型的默認參數。

接下來,您在調用op()時,實際上是調用成員運算符bool operator()(const value_type&, condt value_type&)。這允許op像一個函數對象一樣工作。