2017-01-23 6 views
1

私はC++でシングルトンクラスを持っています(パブリックコンストラクタなし、C++プログラマはclass.instance()を呼び出してシングルトンを作成するか、既存のものを返します)。pybind11を使ってシングルトンクラスをラップする方法は?

これをPythonレベルで非表示にすることをお勧めします。もし私がPythonシングルトンを書いていたら、私は__new__にそれを扱います。クラスにpublicコンストラクタがない場合、私は__init__ラッパーを作成することはできません(私の試みは失敗しました)。私は012bの言及をpybind11の文書で見たことがなかった(しかし、それを逃してしまったかもしれないが、Googleは__new__という言及なしに、 "new"を含むリターンページをエライドすることを喜んでいるようだ)。

pybind11(またはさらにBoost.Python)のシングルトンレシピはありますか?

答えて

0

私はpybind11についてはわかりませんが、Boost.Pythonを使用してクラスをラップすることができるはずです。

使用noncopyableおよび/またはno_init(あなたの質問は...読み込み "あるいはBoost.Python"):

class_<Klass, boost::noncopyable>("Klass", no_init) 
    .staticmethod("instance") 
    ; 

https://mail.python.org/pipermail/cplusplus-sig/2004-March/006647.html

1

あなたはドン場合は、」__init__を公開する必要はありません。あなたのクラスをPythonからインスタンス化しません。あなたの質問については、次のようなものを試すことができます:

py::class_<CppSingle>(mod, "Single") 
.def_static("__new__", [](py:object) { return CppSingle::instance();)}, 
py::return_value_policy::reference_internal); 
関連する問題