私はC++で書かれ、SWIGを介してPythonに公開されているライブラリを使用しています。クラス階層は次のようになります。
PublicLib:
MyBaseClass
PrivateLib:
MyAbstractClass
SomePrivateSubclass : MyAbstractClass, MyBaseClass
...
ここで多重継承スキームに注意してください。また、PublicLibとPrivateLibの両方のクラスがPythonオブジェクトとして公開されていることに注意してください。
ここで、別のライブラリでC ++関数を呼び出し、オブジェクトの1つにポインターを渡しSomePrivateSubClass
ます。関数は次のようになります。
void RegisterCallback(void* param);
次に、コールバックを介してオブジェクトを受け取ることを期待しています。
void SomeCallback(void* param) {
MyBaseClass& cls = *(MyBaseClass*)param;
cls.xxxx; // FAIL
}
失敗する理由は、私が受け取るポインタが基本クラス(MyBaseClass
)ではなく、サブクラスの1つであるためです。「通常の」C++では、次のようにします。
void RegisterCallback(MyBaseClass* param) { ... }
void SomeCallback(void* param) {
MyBaseClass& cls = *(MyBaseClass*)param;
cls.xxxx; // FAIL
}
コンパイラがこれをすべて処理してくれます。
問題は、この場合、基本クラスへのポインタを取得する方法はありますか?Python側でコードを操作することはできますが、SWIGには基本クラスにキャストする方法がないようです(私が見ることができます)。RTTIも使用してみましたが、型識別子は取得できますが、サイズや基本クラスへのポインタなど、他の型情報は取得できないようです。