我使用以下基于模板的方法为IOCContainer创建工厂委托函子:
template <typename T, typename ... D>
void wire(void)
{
std::type_index type = typeid(T);
auto iter = m_repository.begin();
while(iter!=m_repository.end()){
if((iter->first) == type ||
(iter->second)->getType() == type){
break;
}
iter++;
}
auto delegate = [this]() -> T * {
return new T(this->resolve<D>()...);
};
auto component = iter->second;
component->setResolver(std::shared_ptr<Resolver>(new DelegateResolver<T>(delegate, this)));
}
使用此方法可以创建包含T的新瞬态对象实例 多个依赖项D.在创建委托时动态解析依赖项。这很好用 对于任何严格按类型解析的依赖关系。
然而,我也是按合同注册的类型(作为界面或摘要的具体实现) 可以通过名称引用的类)。由于这个原因,我要考虑依赖布线的参数 太。我怎么能存档这个?
首先,我想过为我的依赖项使用一个简单的模板,它包含所需的参数 并且可以在解决时设置为参数:
template <typename D>
void resolve(const D& dependency) {}
这个模板的实现很简单。我可以写一个额外的模板功能,允许我 连接这些依赖项:
template <typename T, typename ... D>
void wire(const D&... dependencies)
{}
但是如何在委托仿函数的resolve调用中解压缩可变参数模板参数包 创建?要获得这样的解决方案:
auto delegate = [this]() -> T * {
return new T(this->resolve<D>(D)...);
};
任何想法?
答案 0 :(得分:1)
听起来你只需要发送dependency
作为参数:
auto delegate = [this]() -> T * {
return new T(this->resolve(dependency)...);
};