用于处理每个参数类型的Rercusive模板

时间:2013-06-21 17:21:28

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

这是用于构建给定类型的对象的通用函数。感谢variadics模板如果找到匹配的构造函数,将构造T,否则编译器将在编译时抛出错误。

template <typename T, typename... Args>
void * build(Args... args){
    return new T(args...);
}

现在假设我不是传递N个参数,而是想从其他地方获取它们,例如从单例中获取它们,然后我必须在某种程度上扩展Arguments并根据每个参数的类型调用一个方法:

class Singleton{

public:
    template <typename T>
    static T* getIstance(){ 
        return reinterpret_cast<T*>(istances_map[typeid(T).has_code()]);
    }
};

现在假设我打电话

MyClass * p = build<MyClass,Foo,Bar>();

我想要做的是调用MyClass构造函数,并且从单例中获取Foo和Bar的相应位置。这应该是扩展模板代码的示例:

MyClass * p = new MyClass( Singleton::getIstance<Foo>(),
                           Singleton::getIstance<Bar>()  
                          );

我觉得我需要一个递归模板和一个元组来解决这个问题。但那只是一种感觉。

2 个答案:

答案 0 :(得分:1)

你有没有尝试过:

template <typename T, typename... Args>
T* build() {
  return new T(Singleton::getIstance<Args>()...);
}

答案 1 :(得分:1)

template <typename T, typename... Args>
T* build()
{
    return new T{Singleton::getInstance<Args>()...};
}