2012-03-06 105 views
0

我想在模板函數中添加一個可選參數...基本上是一個參數,它根據用戶的類型重載關係運算符。這是我的第一個模板功能,所以我很基本。這應該通過用戶類型的向量進行排序並返回最好的元素。例如:模板函數中的可選參數

template <typename Type> 
Type FindMax(std::vector<Type> vec, RelationalOverloadHere) 
/..../ 

第二個「可選」參數是什麼樣的?

回答

4

通常這是像

template<typename Type, typename BinaryOperation = std::less<Type> > 
Type FindMax(const std::vector<Type>& vec, BinaryOperation op = BinaryOperation()); 

所以標準比較是<,但如果需要,可以定製。

標準庫,各自的算法是max_element與以下過載:

template<typename ForwardIterator, typename Compare> 
    ForwardIterator 
    max_element(ForwardIterator first, ForwardIterator last, Compare comp); 
+0

+ 1,打我5秒 – 2012-03-06 01:30:15

+0

我認爲模板參數* function template *的默認參數只允許在C++ 11中使用。但我可能是錯的。讓我知道如果我錯了。 – Nawaz 2012-03-06 01:43:18

+0

@Nawaz我知道Visual Studio不允許它,但這並不意味着什麼...... – 2012-03-06 02:06:00

1

這不是爲你問到底是什麼非常清楚。但是..

下面是其默認值的可選參數的情況下,用戶指定不提供任何內容:

template <typename Type> 
Type FindMax(const std::vector<Type> & vec, int foo = 1 /* <- This is a default that can be overridden. */) 
// ... 
1

這是表示什麼,我想你一個例子的工作方案正在尋找:

#include <vector> 
#include <iostream> 
#include <functional> 
#include <algorithm> 

template <typename Type, typename Compare = std::less<Type>> 
Type findmax(std::vector<Type>& v, Compare comp = Compare()) 
{ 
    return *std::max_element(v.begin(), v.end(), comp); 
} 


int main() 
{ 
    int a[] = {1, 11, 232, 2, 324, 21}; 
    std::vector<int> v(a, a+6); 

    std::cout << findmax(v) << std::endl; 
} 
+0

就是這樣Jesse!萬分感謝。 – MCP 2012-03-07 15:29:57

+0

現在...我收到錯誤,默認模板參數只允許在類模板...建議?是否只能將該函數(findmax)重寫爲一個類? – MCP 2012-03-08 18:19:23