2017-08-31 105 views
1

我有一個具有重載方法的類。某個子類繼承這兩種類型。是否可以設置一個默認的方法調用,以避免調用static_cast<class>(obj)爲不明確的重載函數調用創建默認值

struct A {}; 
struct B { 

    void foo(const A) { 
    /*impl*/ 
    } 

    void foo(const B) { 
    /*impl*/ 
    } 
}; 

struct C : A, B { 

}; 

int main() { 
    C c; 
    B b; 
    b.foo(c); //ambiguous 
} 

有什麼辦法可以讓編譯器默認的某些方法調用?

*接受了聰明/優雅的解決方法。

+2

如何聲明'void foo(const C)'以便它可以調用默認值? – wally

+0

對不起,foo是一個超類的方法調用,C是一個子類。我將編輯我的問題來展示這一點。 –

+0

也許在發佈之前嘗試編譯您的示例。有很多語法錯誤,現在的問題令人困惑,因爲如果它是一個成員函數,foo不能被這樣調用。 – wally

回答

1

你可以使用一個模板做static_cast爲你,然後調用默認:

struct A {}; 
struct B { 

    template<typename T> 
    void foo(T& t) { 
     foo(static_cast<A&>(t)); 
    } 

    void foo(const A) { 
     /*impl*/ 
    } 

    void foo(const B) { 
     /*impl*/ 
    } 
}; 

struct C : A, B { 

}; 

int main() { 
    C c; 
    B b; 
    b.foo(c); //eventually calls foo(A) 
} 

但話又說回來它可能只是更容易聲明一個成員函數,它C

+0

投票選出最佳,最好的工作。沒有意識到你可以在不使用鑽石托架的情況下以這種方式使用模板。我正在寫一個數學庫(帶有運算符),因此不需要static_cast或<>對於乾淨的符號目的來說是非常棒的。 謝謝 –

相關問題