2015-11-28 36 views
-1

我有一個模板類,像這樣:模板類的==操作符()隱式轉換

struct Base 
{ 
    bool operator==(const Base& other) const { 
     return v == other.v; 
    } 
    int v; 
}; 
struct Abc : public Base 
{ 
    void execute() { /*logic1*/ } 
}; 

struct Def : public Base 
{ 
    void execute() { /*logic2*/ } 
}; 

template <typename T> 
class Foo 
{ 
public: 
    bool operator==(const Foo& other) const { 
     return (a == other.a) && (b == other.b); 
    } 

    int a; 
    T b; 
}; 

這工作得很好,但是我想延長這個操作符==()方法來允許只有在傳入的對象具有相同的模板類型時才相等。這裏有一個例子:

Foo<Abc> obj1; 
Foo<Abc> obj2; 
Foo<Def> obj3; 

obj1 == obj2; // should be true 
obj1 == obj3; // should fail at compile-time or run-time 

當我這樣做:

bool operator==(const Foo& other) const { 
    std::cerr << typeid(other).name() << std::endl; 
    return (a == other.a) && (b == other.b); 
} 

我注意到,在傳遞的類的實例被隱式轉換爲這個類的類型。我想過在模板對象中加入一個成員變量來區分它們,但是有點煩人的是必須添加一個額外的變量,這感覺就像我不需要的那樣。有沒有更好的方法來實現這種平等測試?

+1

您的運營商只能接受'美孚'或派生類。你是從Foo派生出來的嗎,它有隱含的構造函數嗎?問題是什麼。 –

+0

「以允許相等只有在傳入的對象具有相同的模板類型時纔有效」。目前允許你不想要的其他類型? –

+0

@NeilKirk - Foo沒有派生類。目前運算符==()通過隱式轉換適用於不同的T類型。我似乎只能選擇完全刪除運算符==()(以防止隱式轉換),或者將其保留並隱式轉換。我希望能夠比較兩個對象,如Foo 和Foo ,並且無法在編譯時或運行時比較Foo 和Foo 。 – Dan

回答

1

據我所知,存在從Foo<T1>Foo<T2>的隱式轉換。

可能的解決方案是:

  1. 禁止隱式類型轉換(使用explicit關鍵字對構造和轉換運算符)。

  2. operator ==模板,並使用enable_if只允許可能的組合:

    template <typename T1, typename = std::enable_if<std::is_same<T, T2>::value>::type> 
    bool operator == (const Foo<T1>& other) const 
    
+0

謝謝,第二個選項看起來可行。你能舉一個例子來說明第一個選項如何爲這個用例提供幫助嗎? – Dan

+0

只需按照評論中的要求提供更多代碼即可。 –