2

私は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も使用してみましたが、型識別子は取得できますが、サイズや基本クラスへのポインタなど、他の型情報は取得できないようです。

4

0 に答える 0