2014-12-07 66 views
2

情況:快遞偏好的考慮下面的代碼曖昧模板功能

struct Zero{}; 

template<typename T> 
Zero operator*(const Zero& zero, const T& other){return Zero();} 

struct Identity{}; 

template<typename T> 
T operator*(const T& other, const Identity& id){return T();} 

現在,我想用這個代碼:

Zero z; 
Identity id; 
int i = 5; 
z * i; // ok 
i * id; // ok 
z * id; //error: ambiguity in function resolution 

編譯器將不能夠解決最後一行中的操作符,因爲可以使用這兩個函數。事實上,在這種情況下,我不關心使用哪個函數,因爲它們具有相同的功能。在這兩種情況下,Zero()將按預期返回。

我的問題:我如何表達,在這種情況下,任何功能都可以使用?

+0

BTW:您可能想看看'constexpr'。 – Deduplicator 2014-12-07 21:46:16

回答

3

只需多加一個過載(這是不以任何形式模板):

Zero operator*(const Zero& other, const Identity& id){return Zero();} 
+0

這也適用。 +1 – Deduplicator 2014-12-07 21:37:31

2

只需使用SFINAE以不考慮第一模板,如果TIdentity

template<typename T> auto operator*(const Zero& zero, const T& other) 
-> typename std::enable_if<!std::is_same<T, Identity>::value, Zero>::value 
{return {};} 
+0

我喜歡這個答案。雖然它使代碼變得更加複雜,但當我開始使用不同版本的運算符時(例如,當'Identity'或'Zero'模板化時),這是更可取的。在之前的答案中,我將不得不復制代碼。非常感謝! – Alex 2014-12-07 23:06:30