簡體   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