我正在尋找一些適當的界面來處理方面約類(處理類),但不是他們正在處理的實際類(元方面)的一部分的建議。這需要一些解釋...什麼是處理類的元方面的適當接口?
在我的具體示例中,我需要實現一個自定義的RTTI系統比C++提供的更復雜一點(我不會去探討爲什麼我需要這個)。我的基礎對象是FooBase
,並且此基數的每個子類都與一個FooTypeInfo
對象關聯。
// Given a base pointer that holds a derived type,
// I need to be able to find the actual type of the
// derived object I'm holding.
FooBase* base = new FooDerived;
// The obvious approach is to use virtual functions...
const FooTypeInfo& info = base->typeinfo();
使用虛擬函數來處理對象的運行時類型並不適合我。我傾向於將對象的運行時類型視爲超出類範圍的東西,因此它不應該成爲其顯式接口的一部分。下面的界面讓我感覺舒服很多......
FooBase* base = new FooDerived;
const FooTypeInfo& info = foo::typeinfo(base);
然而,即使接口不是類的一部分,實施仍必須使用虛擬函數,爲了這個工作:
class FooBase
{
protected:
virtual const FooTypeInfo& typeinfo() const = 0;
friend const FooTypeInfo& ::foo::typeinfo(const FooBase*);
};
namespace foo
{
const FooTypeInfo& typeinfo(const FooBase* ptr) {
return ptr->typeinfo();
}
}
你覺得我應該用這個第二個接口(即感覺更適合我),處理稍微複雜的實現,或者768,16我只是第一個接口去?
@Seth卡內基
這是一個困難的問題,如果你甚至不想派生類知道作爲RTTI的一部分......因爲你不能真正做到構造函數中的任何東西都依賴於被實例化的類的運行時類型(出於同樣的原因,您不能在ctor或dtor中調用虛擬方法)。
FooBase
是層次結構的共同基礎。我還有一個單獨的CppFoo<>
類模板,可以減少樣板的數量,並使類型的定義更加容易。還有另一個PythonFoo
類與Python派生對象一起工作。有關如何在系統的工作原理可以在這裏找到
template<typename FooClass>
class CppFoo : public FooBase
{
private:
const FooTypeInfo& typeinfo() const {
return ::foo::typeinfo<FooClass>();
}
};
class SpecificFoo : public CppFoo<SpecificFoo>
{
// The class can now be implemented agnostic of the
// RTTI system that works behind the scenes.
};
的詳細原因:
► https://stackoverflow.com/a/8979111/627005
我認爲所有將參與您的自定義RTTI的類必須從'FooBase'繼承。會不會讓每個類都重寫虛函數來賦予它們的類型,而是用一個唯一的ID調用一個構造函數'FooBase(int)'並且初始化一個'const int'成員,這樣一來,函數' foo :: typeinfo'只是一個變量檢索而不是虛函數調用? –
@SethCarnegie我需要自定義RTTI的部分原因是我的程序將Python嵌入爲腳本語言,因此RTTI系統需要在兩種語言之間保持一致。在兩種語言之間保持ID是唯一的可能會出現一些問題。 [續] –
@SethCarnegie [續]還有一個問題就是你的建議引入了一些樣板。我不希望腳本定義的類型必須處理像這樣的任何實現細節;目前您只需像在普通Python應用程序中那樣編寫該類,並且希望保持這種狀態。 –