約クラス(クラスを扱う)について扱う適切なインターフェイスは何かをアドバイスしていますが、実際のクラス(メタ・アスペクト)の一部ではありません。これはいくつかの説明を必要とします...クラスのメタ面を扱うための適切なインターフェースは何ですか?
私の具体的な例では、C++で提供されているものよりも少し複雑なカスタムRTTIシステムを実装する必要があります(私が必要とする理由はありません)。私のベースオブジェクトは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();
}
}
あなたは私が(私にとってより適切な感じ)、この第2のインターフェースを使用して、多少複雑な実装に対処すべきだと思いますか、私は最初のインターフェイスで行くshoud?
@Sethカーネギー
あなたが本当に行うことはできませんので、あなたも...派生クラスがRTTIの一部であることについて知られたくない場合、これは難しい問題です
FooBase
コンストラクタ内のインスタンス化されるクラスの実行時の型に依存するもの(同じ理由で、ctorまたはdtor内で仮想メソッドを呼び出すことはできません)。
FooBase
は、階層の共通基盤です。ボイラープレートの量を減らし、タイプの定義を簡単にする別のクラステンプレートも用意されています。 Pythonの派生オブジェクトで動作する別のPythonFoo
クラスがあります。システムの作品はここに見つけることができる方法の詳細
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が必要な理由の1つは、自分のプログラムがPythonをスクリプト言語として組み込んでいるため、RTTIシステムが2つの言語間で一貫している必要があるということです。 IDを2つの言語の間で一意に保つことで生じるいくつかの問題があるかもしれません。 [cont'd] –
@SethCarnegie [cont。]あなたが提案したものがある定型文を紹介するという問題もあります。私は、スクリプト定義の型がこのような実装の詳細を処理する必要はありません。現在のところ、通常のPythonアプリケーションと同じようにクラスを作成するだけです。そのままにしておきたいと思います。 –