0

テンプレート化された外部構造体に内部構造体がある C++ データ構造がいくつかあります。テンプレート パラメータに応じて、内部構造体は同じ型である場合と異なる場合があります。boost.python を使用して構造を python に公開するときに、内部クラスを Outer.Inner として参照できるようにしたいと考えています。私のboost.python公開コードでは、それぞれの異なる内部型を1回だけ公開する必要があります。同じ内部クラスを複数回公開しないように boost.python レジストリにクエリを実行できますが、以前に公開された内部クラスをその外部クラスの属性にするにはどうすればよいですか? この簡略化された例を考えると、質問はより明確になる可能性があります。

#include <boost/python.hpp>

struct inner {
};

template< typename T >
struct outer {
    typedef inner inner_t;

    static const char * name();

    static
    void expose() {
        using namespace boost::python;

        class_< outer< T > > outer_class( name() );

        // check if inner type is in registry already
        const type_info inner_info = boost::python::type_id< inner_t >();
        const converter::registration * inner_registration
            = boost::python::converter::registry::query( inner_info );
        if( inner_registration == 0 || inner_registration->m_to_python == 0 ) {
            // not already in registry
            scope outer_scope( outer_class );
            class_< inner_t > inner_class( "Inner" );
        } else {
            // already in registry because exposed via different outer
            // what to put here? In python we need Outer.Inner to exist
        }
    }
};

template<>
const char *
outer< int >::name() { return "IntOuter"; }

template<>
const char *
outer< double >::name() { return "DoubleOuter"; }

BOOST_PYTHON_MODULE( inner_classes )
{
    outer< int >::expose();
    outer< double >::expose();
}

実行したいpythonコードは次のとおりです。

import inner_classes as IC

IC.IntOuter.Inner
IC.DoubleOuter.Inner

完全を期すために、上記をコンパイルするための Jamroot を次に示します。

import python ;
use-project boost : $(BOOST_ROOT) ;

project : requirements <library>/boost/python//boost_python ;

python-extension inner_classes : inner-classes.cpp ;

install install
  : inner_classes 
  : <install-dependencies>on <install-type>SHARED_LIB <install-type>PYTHON_EXTENSION 
    <location>. 
  ;

local rule run-test ( test-name : sources + )
{
    import testing ;
    testing.make-test run-pyd : $(sources) : : $(test-name) ;
}
run-test test : inner_classes test_inner_classes.py ;
4

1 に答える 1