Salut,
J’allais faire un pattern Singleton de façon à n’instancier ma classe que lorsqu’elle est demandée. Ainsi j’ai pensé que le shared_ptr était tout à fait approprié. Seulement, pour rendre ma classe non-constructible j’ai passé mon constructeur en private, et donc la fonction std::make_shared
ne peut pas s’effectuer. La solution ma paraissait alors toute simple, il suffit de rendre la fonction make_shared amie, seulement le template variadique me pose problème, le compilo m’engeule, je n’arrive pas à comprendre la syntaxe.
Est-ce que quelqu’un pourrait me guider vers la bonne syntaxe de ce que je cherche à faire ?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <memory> #include <iostream> class SharedSingleton { SharedSingleton(const SharedSingleton &) = delete; SharedSingleton(SharedSingleton &&) = delete; SharedSingleton & operator=(const SharedSingleton &) = delete; SharedSingleton & operator=(SharedSingleton &&) = delete; public: static std::shared_ptr<SharedSingleton> get(); ~SharedSingleton() {std::cout << "destruction de SharedSingleton" << std::endl;} private: SharedSingleton() {std::cout << "construction de SharedSingleton" << std::endl;} static std::weak_ptr<SharedSingleton> m_instance; template<class ...Args> friend std::shared_ptr<SharedSingleton> std::make_shared<SharedSingleton, Args...> (Args&&... args); }; std::weak_ptr<SharedSingleton> SharedSingleton::m_instance = std::weak_ptr<SharedSingleton>(); std::shared_ptr<SharedSingleton> SharedSingleton::get() { if(m_instance.expired()) { auto instance = std::make_shared<SharedSingleton>(); m_instance = instance; return instance; } else return m_instance.lock(); } int main() { std::shared_ptr<SharedSingleton> test = SharedSingleton::get(); std::shared_ptr<SharedSingleton> autreTest = SharedSingleton::get(); return 0; } |
Sinon, je peux passer par le constructeur de shared_ptr std::shared_ptr<SharedSingleton> instance (new SharedSingleton());
ça me fait faire un appel à new mais j’ai accès au constructeur puisque je suis dans une fonction membre de ma classe.
Est-ce mieux que d’ajouter une fonction amie ?
J’allais oublier l’erreur compilateur
1 2 3 | main.cpp:22:103: error: invalid use of template-id 'make_shared<SharedSingleton, Args ...>' in declaration of primary template friend std::shared_ptr<SharedSingleton> std::make_shared<SharedSingleton, Args...> (Args&&... args); |