Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

C++11を使用したsingletonの作成方法 #606

Open
t-sakashita opened this issue Aug 6, 2023 · 8 comments
Open

C++11を使用したsingletonの作成方法 #606

t-sakashita opened this issue Aug 6, 2023 · 8 comments
Assignees
Milestone

Comments

@t-sakashita
Copy link
Owner

t-sakashita commented Aug 6, 2023

C++11のMagic Staticsを用いたsingletonの作成方法を検討。
ポインタを使わなくて済む。
スレッドセーフな方法。

https://stackoverflow.com/questions/137975/what-are-drawbacks-or-disadvantages-of-singleton-pattern
https://stackoverflow.com/questions/44525097/what-is-the-right-way-of-setting-member-pointers-to-null-in-a-singleton-class
https://codereview.stackexchange.com/questions/173929/modern-c-singleton-template

@t-sakashita
Copy link
Owner Author

@t-sakashita
Copy link
Owner Author

t-sakashita commented Aug 6, 2023

とりあえず、戻り値はポインタのままとして、以下のように変更してみた。

  static factory* instance() {
    static factory instance;
    return &instance;
  }

以下が不要となる。

  static inline factory* instance_;

そのため、pyrokko.cppの以下の宣言が意味をなさなくなる。

#define PYROKKO_DEFINE_FACTORY(T)               \
template<> \
T*  T::instance_;


PYROKKO_DEFINE_FACTORY(rokko::detail::sd_solver_factory)
PYROKKO_DEFINE_FACTORY(rokko::detail::pd_solver_factory)

PYROKKO_DEFINE_FACTORY(rokko::detail::ps_solver_factory)
PYROKKO_DEFINE_FACTORY(rokko::detail::ps_mapping_1d_factory)
PYROKKO_DEFINE_FACTORY(rokko::detail::ps_mapping_1d_factory_num)
PYROKKO_DEFINE_FACTORY(rokko::detail::ps_crs_factory)

miniij.cppの実行は正常終了。
だが、minij.pyの実行で、#391 と同様のエラーが発生する。

@t-sakashita t-sakashita self-assigned this Aug 6, 2023
@t-sakashita
Copy link
Owner Author

t-sakashita commented Aug 6, 2023

staticなクラス変数instance_を削除した場合、pythonラッパーにおいて、sd_solver_factoryを実体化する方法が分からない。

rokko::detail::sd_solver_factory::instance()を呼び出してみる。

template<>
rokko::detail::sd_solver_factory& rokko::detail::sd_solver_factory::instance();

PYBIND11_MODULE(pyrokko, m) {

コンパイルエラー:

[100%] Building CXX object rokko/CMakeFiles/pyrokko.dir/pyrokko.cpp.o
/Users/sakashitatatsuya/development/rokko/rokko/pyrokko.cpp:205:71: error: explicit specialization of 'instance' after instantiation
  rokko::detail::sd_solver_factory& rokko::detail::sd_solver_factory::instance();
                                                                      ^
/Users/sakashitatatsuya/development/rokko/rokko/serial_dense_ev.hpp:344:47: note: implicit instantiation first required here
    : solver_impl_(detail::sd_solver_factory::instance().make_product(solver_name)) {}
                                              ^

@t-sakashita
Copy link
Owner Author

t-sakashita commented Aug 6, 2023

factory.hppを、static local variableをstd::unique_ptrで定義するのが、一番筋が良い。

  static inline factory& instance() {
    static const std::unique_ptr<factory> instance_(std::make_unique<factory>());
    return *instance_.get();
  }

関数のinline宣言は不要かも。

minij.pyの実行で、#391 と同様に、ソルバが見つからないというエラーが発生する。
その理由は、pythonラッパーにおいて、sd_solver_factoryを実体化できていないためだろう。

@t-sakashita t-sakashita added this to the Big crunch milestone Aug 7, 2023
@t-sakashita t-sakashita changed the title C++17向けのsingletonの作成方法の変更 C++11向けのsingletonの作成方法 Aug 7, 2023
@t-sakashita t-sakashita changed the title C++11向けのsingletonの作成方法 C++11を使用したsingletonの作成方法 Aug 7, 2023
@t-sakashita
Copy link
Owner Author

t-sakashita commented Aug 20, 2023

static inline std::unique_ptr<factory> instance_をmagic staticsで生成すると、このinstance_はクラス外から見えなくなるので、他のヘッダファイルdeclare_factory_instance.hppで宣言できない。
instance_の代わりに、static inline int largest_priority_をクラス外で宣言してみた。

#define ROKKO_DECLARE_FACTORY_INSTANCE(T) \
template<> \
int  T::largest_priority_;

Mac+clangで、minij.pyを実行すると、固有値ソルバが一つも登録されていなかった。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant