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