parent
7d81f2a594
commit
7f121cf0fc
@ -0,0 +1,107 @@
|
||||
|
||||
#ifndef CPP_START_CONTAINER_H
|
||||
#define CPP_START_CONTAINER_H
|
||||
|
||||
#include <unordered_map>
|
||||
#include "../base/any.h"
|
||||
#include "../base/non_copy_able.h"
|
||||
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <memory>
|
||||
#include <functional>
|
||||
|
||||
using namespace std;
|
||||
|
||||
class IocContainer : NonCopyAble {
|
||||
public:
|
||||
IocContainer() {}
|
||||
|
||||
~IocContainer() {}
|
||||
|
||||
// 注册需要创建对象的构造函数
|
||||
template<class T, typename Depend, typename... Args>
|
||||
void RegisterType(const string &strKey) {
|
||||
// 注意,这里创建的是依赖的对象!不再是创建对象!
|
||||
// 通过闭包擦除了Depend参数类型
|
||||
std::function<T *(Args...)> function = [](Args... args) { return new T(new Depend(args...)); };
|
||||
RegisterType(strKey, function);
|
||||
}
|
||||
|
||||
// 根据唯一标识查找对应的构造函数,并创建指针对象
|
||||
template<class T, typename... Args>
|
||||
T *Resolve(const string &strKey, Args... args) {
|
||||
if (m_creatorMap.find(strKey) == m_creatorMap.end()) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Any resolver = m_creatorMap[strKey];
|
||||
// 将查找到的Any转换为function
|
||||
std::function<T *(Args...)> function = resolver.AnyCast<std::function<T *(Args...)>>();
|
||||
|
||||
return function(args...);
|
||||
}
|
||||
|
||||
// 创建智能指针对象
|
||||
template<class T, typename... Args>
|
||||
std::shared_ptr<T> ResolveShared(const string &strKey, Args... args) {
|
||||
T *ptr = Resolve<T>(strKey, args...);
|
||||
return std::shared_ptr<T>(ptr);
|
||||
}
|
||||
|
||||
void RegisterType(const string &strKey, Any constructor) {
|
||||
if (m_creatorMap.find(strKey) != m_creatorMap.end()) {
|
||||
throw std::invalid_argument("this key has already exist!");
|
||||
}
|
||||
// 通过Any擦除不同类型的构造器
|
||||
m_creatorMap.emplace(strKey, constructor);
|
||||
}
|
||||
|
||||
private:
|
||||
unordered_map<string, Any> m_creatorMap;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
class Container : NonCopyAble {
|
||||
|
||||
private:
|
||||
std::unordered_map<std::string, Any> mCreatorMap;
|
||||
|
||||
public:
|
||||
Container() {};
|
||||
|
||||
~Container() {};
|
||||
|
||||
template<typename T, typename Depend, typename... Args>
|
||||
void registerType(const std::string &key) {
|
||||
std::function<T *(Args...)> func = [](Args... args) {
|
||||
return new T(new Depend(args...));
|
||||
};
|
||||
registerType(key, func);
|
||||
}
|
||||
|
||||
template<typename T, typename... Args>
|
||||
T *resolve(const std::string &key, Args ... args) {
|
||||
if (mCreatorMap.find(key) == mCreatorMap.end()) {
|
||||
return nullptr;
|
||||
}
|
||||
Any constructor = mCreatorMap[key];
|
||||
std::function<T *(Args...)> function = constructor.cast<std::function<T *(Args...)>>();
|
||||
return function(args...);
|
||||
}
|
||||
|
||||
private:
|
||||
void registerType(const std::string &key, Any constructor) {
|
||||
auto it = mCreatorMap.find(key);
|
||||
auto end = mCreatorMap.end();
|
||||
if (mCreatorMap.find(key) != mCreatorMap.end()) {
|
||||
// TODO 多次添加
|
||||
throw std::invalid_argument("this key has aleady exist!");
|
||||
}
|
||||
mCreatorMap.emplace(key, constructor);
|
||||
}
|
||||
|
||||
};
|
||||
*/
|
||||
#endif //CPP_START_CONTAINER_H
|
Loading…
Reference in new issue