这是用于构建给定类型的对象的通用函数。感谢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>()
);
我觉得我需要一个递归模板和一个元组来解决这个问题。但那只是一种感觉。
答案 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>()...};
}