2009-09-03 61 views
2

在Perl中,存在着一個通用::能方法,你可以調用任何類或對象,以確定它是否能夠做一些事情:有沒有辦法在運行時確定對象是否可以在C++中執行方法?

sub FooBar::foo {} 
print "Yup!\n" if FooBar->can('foo'); #prints "Yup!" 

說我有在C++中,可以是任何一個基類指針有很多不同的派生類,有沒有簡單的方法來完成類似的東西?我不想在其他派生類中碰到任何東西,我只能改變調用函數的基類中的區域,以及支持它的派生類。

編輯︰等待,這是顯而易見的(從來沒有問題),我可以在返回一個數字表示UNIMPLEMENTED的基地執行它,然後檢查,當你調用它時,返回不是這個。我不確定我爲什麼以這麼複雜的方式來思考事情。

我也在想我會從另一個執行foo的派生我的班,然後看看是否動態轉換到這個類的工作與否。

+1

這是一樣的:http://stackoverflow.com/questions/87372/is-there-a-technique-in-c-to-知道如果一個類有一個成員函數的一個給定的s – fbrereto 2009-09-03 18:36:14

+0

請記住,該函數必須虛擬爲您的解決方案工作。 – 2009-09-09 20:07:15

回答

7

如果您有指針或對基類的引用,您可以使用dynamic_cast來查看它是哪個派生類(以及它支持哪個派生類的方法)。

3

C++沒有內置的運行時反射。您可以完全自由地將自己的反射實現構建到您的類層次結構中。這通常涉及一個靜態地圖,它會填充一個名稱和函數列表。您必須手動註冊您想要的每個功能,並且對調用約定和功能簽名具有一致性。

5

如果您可以向基類添加方法,則可以添加virtual bool can_foo() {return false;}並在foo的子類中將其覆蓋以返回true。

2

我相信最正確的方法是使用typeid <>運算符並獲得對type_info對象的引用,然後可以將(==運算符)與所需數據類型的type_info進行比較關心某人或某事。

這不會給你方法級別的檢查,並且確實要求你已經啓用了RTTI(我認爲在沒有RTTI結果的對象上使用typeid <>具有「未定義」行爲),但你在那裏。

MSDN有一個在線的參考,讓你開始:http://msdn.microsoft.com/en-us/library/b2ay8610%28VS.80%29.aspx

相關問題