代码拉取完成,页面将自动刷新
同步操作将从 四月是你的谎言/深入应用C++11:代码优化与工程级应用 的实践代码 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
#include <string>
#include <map>
#include <memory>
#include <functional>
#include <iostream>
template <class T>
class IOCContainer
{
public:
IOCContainer(void) {}
~IOCContainer() {}
template <class Drived>
void RegisterType(std::string strKey)
{
std::function<T *()> function = []
{ return new Drived(); };
RegisterType(strKey, function); //将唯一key 和 构建函数 绑定在一起
}
T *Resolve(std::string strKey)
{
if (m_creatorMap.find(strKey) == m_creatorMap.end())
return nullptr;
std::function<T *()> function = m_creatorMap[strKey];
return function();
}
std::shared_ptr<T> ResolveShared(std::string strKey)
{
T *ptr = Resolve(strKey);
return std::shared_ptr<T>(ptr);
}
private:
void RegisterType(std::string strKey, std::function<T *()> creator)
{
if (m_creatorMap.find(strKey) != m_creatorMap.end())
{
throw std::invalid_argument("this key has already exits!");
}
m_creatorMap.emplace(strKey, creator); // Inserts a new element in the map if its key is unique
}
std::map<std::string, std::function<T *()>> m_creatorMap;
};
struct ICar
{
virtual ~ICar() {}
virtual void test() const = 0;
};
struct Bus : ICar
{
Bus(){}
void test() const { std::cout << "Bus::test()" << std::endl;}
};
struct Car :ICar
{
Car(){}
void test() const {std::cout << "Car::test()" << std::endl;}
};
int main(int argc, char const *argv[])
{
IOCContainer<ICar> carioc;
carioc.RegisterType<Bus>("bus");
carioc.RegisterType<Car>("Car");
std::shared_ptr<ICar> bus = carioc.ResolveShared("bus");
bus->test();
std::shared_ptr<ICar> car = carioc.ResolveShared("Car");
car->test();
return 0;
}
/**
* @brief 上面的例子 可以创建所有的无参数的派生类对象,但存在几个不足之处:
* 1. 只能创建无参对象,不能创建有参数的对象
* 2. 只能创建一种接口类型的对象,不能创建所有类型的对象
*
* 如果希望这个工厂能够创建所有对象,则需要通过类型擦除技术来实现。
*
*/
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。