2012-03-23 184 views
5

我想使用C++ 11中引入的類型安全可變參數函數,但不適用於不同的類型。 A實施例:具有相同類型參數的類型安全可變參數函數

template<typename T> 
T maxv(T first, T second) { 
    return first > second ? first : second; 
} 

template<typename T, typename ... Rest> 
T maxv(T first, T second, T ... rest) { 
    return maxv(first, maxv(second, rest)); 
} 

類型的所有參數都是相同的,所以它是也許可能寫出類似的東西:

struct Point { int x,y; }; 

template<> 
Point maxv(Point first, Point second) { 
    return first.x > second.x ? first : second; 
} 

maxv({1, 2}, {3, 4});   // no problem  
maxv({1, 2}, {3, 4}, {5, 6}); // compile error 

它編譯與此錯誤在mingw的克++ 4.5:

error: no matching function for call to 'maxv(<brace-enclosed initializer list>, <brace-enclosed initializer list>, <brace-enclosed initializer list>)' 

因爲他不知道{5, 6}Point類型。解決辦法是什麼?

+0

請問/ var/variadic/ – 2012-03-23 17:31:52

+1

我不得不問,你的數據真的存儲在多個非聚合變量中,像max_element這樣的東西不合適嗎? – 2012-03-23 17:51:09

+0

不要專門的功能,而是傳遞一個謂詞。 – Xeo 2012-03-23 18:04:20

回答

10

解決方案是而不是使用可變模板!與函數模板一起使用時,它們旨在推導參數的類型。這不是你想要做的:你想讓參數採取預期的類型。

我沒有大量的實踐經驗與這一點,但你想使用初始化列表此:

Point maxv(std::initializer_list<Point> list) { 
    ... 
} 

你可能會抱怨說,你不能用任意類型,但然後使用這個你需要意識到你需要告訴某個地方涉及哪種類型。 ...儘管您需要指定參數類型,但它可以作爲模板。

相關問題