Use variadic templates to create instance with arguments

This commit is contained in:
Atlante45 2014-12-17 15:23:39 -08:00
parent 7483e800c2
commit d9d0166bc9
2 changed files with 39 additions and 15 deletions

View file

@ -10,11 +10,3 @@
// //
#include "DependencyManager.h" #include "DependencyManager.h"
DependencyManager& DependencyManager::getInstance() {
static DependencyManager instance;
return instance;
}
DependencyManager::~DependencyManager() {
}

View file

@ -16,10 +16,12 @@
#include <typeinfo> #include <typeinfo>
#define SINGLETON_DEPENDENCY(T)\ #define SINGLETON_DEPENDENCY(T, NEED_SET)\
public:\ public:\
typedef QSharedPointer<T> SharedPointer;\ typedef QSharedPointer<T> SharedPointer;\
typedef QWeakPointer<T> WeakPointer;\
private:\ private:\
static constexpr bool REQUIRE_SET = NEED_SET;\
void customDeleter() {\ void customDeleter() {\
QObject* thisObject = dynamic_cast<QObject*>(this);\ QObject* thisObject = dynamic_cast<QObject*>(this);\
if (thisObject) {\ if (thisObject) {\
@ -34,20 +36,50 @@ class QObject;
class DependencyManager { class DependencyManager {
public: public:
// Only accessible method. // usage:
// usage: T* instance = DependencyManager::get<T>(); // T* instance = DependencyManager::get<T>();
// T* instance = DependencyManager::set<T>(Args... args);
// T* instance = DependencyManager::destroy<T>();
template<typename T> template<typename T>
static QSharedPointer<T> get(); static QSharedPointer<T> get();
template<typename T, typename ...Args>
static QSharedPointer<T> set(Args&&... args);
template<typename T>
static void destroy();
private: private:
static DependencyManager& getInstance(); template<typename T>
DependencyManager() {} static QSharedPointer<T>& storage();
~DependencyManager();
}; };
template <typename T> template <typename T>
QSharedPointer<T> DependencyManager::get() { QSharedPointer<T> DependencyManager::get() {
static QSharedPointer<T> sharedPointer = QSharedPointer<T>(new T(), &T::customDeleter); static bool requireSet = !T::REQUIRE_SET;
if (requireSet) {
set<T>();
requireSet = false;
}
return storage<T>();
}
template <typename T, typename ...Args>
QSharedPointer<T> DependencyManager::set(Args&&... args) {
QSharedPointer<T> instance(new T(args...), &T::customDeleter);
storage<T>().swap(instance);
return storage<T>();
}
template <typename T>
void DependencyManager::destroy() {
storage<T>().clear();
}
template<typename T>
QSharedPointer<T>& DependencyManager::storage() {
static QSharedPointer<T> sharedPointer;
return sharedPointer; return sharedPointer;
} }