C++ コードベースの Python バインディングを構築する必要があります。私は boost::python を使用していますが、テンプレートを使用して返す関数を含むクラスを公開しようとして問題に遭遇しました。これが典型的な例です
class Foo
{
public:
Foo();
template<typename T> Foo& setValue(
const string& propertyName, const T& value);
template<typename T> const T& getValue(
const string& propertyName);
};
典型的な T は、string、double、vector です。
ドキュメントを読んだ後、使用するすべてのタイプに薄いラッパーを使用してみました。string と double のラッパーと、対応するクラス宣言を次に示します。
Foo & (Foo::*setValueDouble)(const std::string&,const double &) =
&Foo::setValue;
const double & (Foo::*getValueDouble)(const std::string&) =
&Foo::getValue;
Foo & (Foo::*setValueString)(const std::string&,const std::string &) =
&Foo::setValue;
const std::string & (Foo::*getValueString)(const std::string&) =
&Foo::getValue;
class_<Foo>("Foo")
.def("setValue",setValueDouble,
return_value_policy<reference_existing_object>())
.def("getValue",getValueDouble,
return_value_policy<copy_const_reference>())
.def("getValue",getValueString,
return_value_policy<copy_const_reference>())
.def("setValue",setValueString,
return_value_policy<reference_existing_object>());
正常にコンパイルされますが、Python バインディングを使用しようとすると、C++ 例外が発生します。
>>> f = Foo()
>>> f.setValue("key",1.0)
>>> f.getValue("key")
Traceback (most recent call last):
File "<stdin>", line 1, in ?
RuntimeError: unidentifiable C++ exception
興味深いことに、ダブルまたは文字列値の Foo のみを公開すると、つまり
class_<Foo>("Foo")
.def("getValue",getValueString,
return_value_policy<copy_const_reference>())
.def("setValue",setValueString,
return_value_policy<reference_existing_object>());
それは正常に動作します。何か不足していますか?