Хобрук: Ваш путь к мастерству в программировании

Boost python, раскрывающий синглтон Мейерса

Я хочу сделать это правильно. Я видел разоблачение boost::serialization::singleton здесь, Boost python export singleton, но я не не хочу использовать это. Вместо этого я хочу использовать простой синглтон Мейерса.

Этот код ниже работает, но в документации говорится, что использование http://www.boost.org/doc/libs/1_43_0/libs/python/doc/v2/reference_existing_object.html#reference_existing_object-spec/ опасен.

Код:

class Singleton 
{
private:
Singleton(){};

public:
static Singleton & getInstance()
{
    static Singleton instance;
    return instance;
}

int getNumber() { return 5; }
};

И в модуле:

class_<Singleton>("singleton", no_init)
    .def("getInstance", &Singleton::getInstance, return_value_policy<reference_existing_object>()).staticmethod("getInstance")
    .def("getNumber", &Singleton::getNumber)

    ;

Как это сделать? Использование return_internal_reference<>() привело к ошибке при выполнении кода Python.

24.05.2012

  • Возможно, если пометить его как C++, это привлечет к нему больше внимания... 24.05.2012

Ответы:


1

Таких вещей у нас в коде много, я не думал о простом способе, но мы их выставляем, возвращая boost::shared_ptr‹> из ссылок с нулевым детиратором (мы каким-то образом переместили части нашего кода в shared_ptr и другие нет, так что это смесь). Это не самая приятная вещь, но она работает так, как ожидалось, и не имеет подводных камней, если вы следите за тем, чтобы ничего не делать с указателем после того, как main был оставлен.

Время жизни вашего объекта переживет интерпретатор, поэтому вам не нужно бояться каких-либо проблем при передаче здесь каких-либо ссылок обратно в python. Библиотека будет выпущена только после выхода интерпретатора (возможно, с вызовом или без вызова ваших деструкторов, иногда может быть целое в случае ошибок или около того). Таким образом, вы можете думать об интерпретаторе как о классической функции main() в этом случае.

class_<XY, shared_ptr<XY>, boost::noncopyable >("XY",no_init)
  .def("getInstance",&XY::getSharedInstance )
  .staticmethod("getInstance")

struct NullDeleter
{
  void operator()(const void*){}
};

XY& XY::getInstance()
{
  static XY in;
  return in;
}

// This can also be written as a standalone function and added to the python class above.
shared_ptr<XY> XY::getSharedInstance()
{
  return shared_ptr<XY>( &getInstance(), NullDeleter() );
}

Или вы можете написать sharedInstance ненавязчиво в отдельную функцию и использовать это в пакете python:

shared_ptr<XY> getSharedInstance()
{
  return shared_ptr<XY>( &XY::getInstance(), NullDeleter() );
}

class_<XY, shared_ptr<XY>, boost::noncopyable >("XY",no_init)
  .def("getInstance",&getSharedInstance )
  .staticmethod("getInstance")
07.09.2012
Новые материалы

Учебные заметки JavaScript Object Oriented Labs
Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

Разбор строк запроса в vue.js
Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
«Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

Как настроить Selenium в проекте Angular
Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

Аргументы прогрессивного улучшения почти всегда упускают суть
В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

Введение в Джанго Фреймворк
Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..