2012-03-08 50 views
0

給出下面的基類:函數重載和繼承的類型不調用正確的過載

struct ValueType { 
    String 
    ToString(String const& format) const; 
}; 

我想這個過載被調用類型從ValueType得出:否則

String FormatValue(const ValueType& value, const String& format) 
{ 
    return value.ToString(format); 
} 

,我希望這種超載被稱爲:

template <typename T> 
String FormatValue(const T& value, const String& format); 

如何確保派生類型不會調用第二個重載?

original question is located here

+0

*任何理由*你不只是使用IOstream的所有類的現有做法?並接受我的建議:在C++中編寫Java或C#是一個糟糕的想法。 – Xeo 2012-03-08 02:49:45

+1

我*認真*將您的問題修剪至我認爲是其核心的部分。雖然它原本寫得很好,但我不認爲所有這些信息都與您的問題非常相關。如果您認爲這是錯誤的,您可以回滾到原始版本。 – 2012-03-08 03:02:01

+0

原始問題仍然可以通過點擊最後一次編輯的時間通過編輯歷史查看,無需將其保存到別處。 :) – Xeo 2012-03-08 03:31:46

回答

3

我不是太喜歡你正在嘗試不同的原因(包括ValueType接口,爲什麼不使用AnyToString總是?)做的,但無論如何,你應該能夠SFINAE

解決你的問題
template <typename T> 
typename enable_if< !is_base_of<ValueType, T>::value, String>::type 
FormatValue(T const & value, const String& format) { ... } 

該代碼的作用是什麼(一旦你讓它編譯:)就會在條件滿足時禁止模板函數。當編譯器認爲模板過載時,它會嘗試替換類型,如果符合條件,則實例化將失敗嵌套type,因此替換失敗並丟棄該模板。之後,最好的重載將是需要一個ValueType對象的版本。

+0

對我來說太快了... – 2012-03-08 03:01:19

+0

@ J.N .:這個問題已經在這裏15分鐘了。 :P大衛3分鐘前回答。慢性子! – Xeo 2012-03-08 03:01:48

+0

你需要在答案中使用boost,(我不認爲有'std :: disable_if')。 – 2012-03-08 03:02:31