2011-09-14 79 views
2

檢測非虛覆蓋我要檢測一個功能是(靜態)覆蓋在派生類中:如何在編譯或運行時

template< typename T > 
struct A{ void func(){ static_cast<T*>(this)->func(); } }; 
struct B: A<B>{}; 
struct C: A<C>{ void func(){ std::cout << "class C" << std::endl; }; 

C c; 
if(&A<C>::func != &C::func) 
    c.func(); 

很顯然,我不會叫「功能」,如果它沒有覆蓋。 我更喜歡直接回答我的問題。告訴實際問題以確定超載。 我也很感激任何答案,顯示其他方法來解決一般問題。

好的,它編譯,我還沒有找到我的實際代碼的差異,那沒有。順便說一句,在我的實際代碼中,我不只是試圖避免調用函數,還有一些。我真的想知道該函數是否被覆蓋,或者如果我需要使用完全不同的方法。

+1

這聽起來很像SFINAE的工作原理。 http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error –

+0

你的代碼沒有意義:'A'是一個模板,但在第2行之下,你可以像使用非模板一樣使用它。 –

+0

那麼,如果您修復了所有編譯器錯誤,則此指針比較似乎可行。所以? – UncleBens

回答

1

作品here順便說一句最簡單的辦法是在A爲空定義f()

struct A{ void func(){ } }; 
+0

實際上,您修正拼寫錯誤後可以正常工作。不知道爲什麼我的實際代碼沒有。 但空的'func'對我沒有意義。在維基百科上查找CRTP,這就是我要做的事情。大致。 – Ingo

+0

也許編譯器有一個錯誤。它不適用於其他版本的gcc。 – jpalecek

0

我不知道任何方式來做你特別要求的,但你可以使用一些很酷的模式來實現使用模板的「靜態多態性」。這消除了您在運行時使用v-table的依賴(實際上,沒有一個用於實現多態的效果)。所以,你應該能夠在編譯時檢查你需要的功能是否可用。

有關於它的一個小前奏在維基百科模板metagrogramming項:

http://en.wikipedia.org/wiki/Template_metaprogramming

它會使你的代碼雖然比較複雜,所以我想你應該想想,不需要這樣的重新設計特點 - 它更多地反映屬性和C++是不是在這個非常好作爲尚未:(