C++ APIをラップしようとしていますが、私はchar*
クラスメンバーのロードブロッキングを打っています。 boost-pythonはchar const *
とstd::string
のタイプを(this answerに基づいて)pythonオブジェクトに自動的に変換しますが、それはchar*
タイプのものです。これは私が(Pythonで)を取得エラーです:boost pythonはchar *データメンバーを自動変換しません。
TypeError: No to_python (by-value) converter found for C++ type: char*
それは、文字列が変更されることはありませんので、これらの特定のchar *
メンバーはおそらくchar const *
として宣言されている必要があることが判明しました。
私はboost-pythonの新機能ですので、明白な答えがあるかもしれませんが、私はこの1つのグーグルでグーグルをしていません。
boost-pythonにこれらのメンバーを自動的に変換させる簡単な方法がありますか?char*
のメンバー? (残念ながら私はラッピングは私の制御下にないよAPIので、char const *
にchar *
の宣言を変更することはできません。)
UPDATE:
[OK]をので、私はカスタムを追加する必要があると思いますコンバータを使用してchar*
のメンバーを処理します。私は1つ書く:
/** to-python convert for char* */
struct c_char_p_to_python_str
{
static PyObject* convert(char* s) {
return incref(object(const_cast<const char*>(s)).ptr());
}
};
// register the QString-to-python converter
to_python_converter<char*, c_char_p_to_python_str>();
残念ながらこれは動作しません。これはエラーです:
私はテンプレート引数は、この署名を持っていることがわかります docsを見てみるとerror: expected unqualified-id
to_python_converter<char*, c_char_p_to_python_str>();
^
:
template <class T, class Conversion, bool convertion_has_get_pytype_member=false>
char*
は、私は、これは「didnの理由です推測しているクラスではありませんので、仕事。誰もがいくつかの洞察力を持っている?
アップデート2:
いいえ。 BOOST_PYTHON_MODULE
コールの中で呼び出される必要があることがわかります。to_python_converter
私はto_python_converter
(一部変更あり)を入手しました。私はフォームのpythonを変換する関数を書いてconverter::registry::push_back
で登録しました。私はto_pythonコードが走っているのを見ることができますが、from_pythonコードは決して走っていないようです。
(http://stackoverflow.com/questions/14029351/the-argument-of-char-converted -to-python-to-call-a-py-function-in-c-by-bo)を使用します。また、他の場所でboostを使用していない場合は、同じ関数を実装するより軽く、より最近の(C++ 11以降の)プロジェクトがあることを知っておいても大丈夫です(pybind11) https://github.com/pybind/pybind11)ここで、この「問題」は存在しないかもしれません。 – Silmathoron
@ Silmathoron、pybind11は有望そうです。やってみます。 – Stephen
型を適合させるゲッター関数とセッター関数でそれらを公開するのはどうですか?ゲッター/セッターは自立した関数であっても、クラスを変更する必要はありません。 –