Variadic模板包打包作为工厂代理的参数

时间:2014-08-28 08:52:04

标签: c++ templates c++11 variadic-templates

我使用以下基于模板的方法为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)...);
};

任何想法?

1 个答案:

答案 0 :(得分:1)

听起来你只需要发送dependency作为参数:

auto delegate = [this]() -> T * {
    return new T(this->resolve(dependency)...);
};