0

这是用于构建给定类型对象的通用函数。感谢可变参数模板如果找到匹配的构造函数 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 Constructor,并从单例中获取 Foo 和 Bar 的相应实例。这应该是扩展模板代码的示例:

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

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

4

2 回答 2

1

你试过了吗:

template <typename T, typename... Args>
T* build() {
  return new T(Singleton::getIstance<Args>()...);
}
于 2013-06-21T18:08:21.050 回答
1
template <typename T, typename... Args>
T* build()
{
    return new T{Singleton::getInstance<Args>()...};
}
于 2013-06-21T18:08:29.750 回答