我正在尝试使用 GCC 和 C++11 构建以下类型的模板化方法:
class Foo
{
private:
//Device handle
cudnnHandle_t handle_;
//Batch sizes
std::vector<int> batch_;
public:
Foo(cudnnHandle_t handle, std::vector<int> batch) : handle_(handle), batch_(batch) {}
template<typename T, typename... Args> T create(Args&&... args)
{
if(std::is_base_of<Element,T>::value)
return T(handle_,args...);
if(std::is_same<Block,T>::value)
return T(handle_,batch_,args...);
}
};
然而,由于返回语句,这无法编译。如果 T 是 Block,则 return T(handle_,args...) 将失败,如果 T 是 Element 基本类型,则 return T(handle,batch_,args...) 将失败。
我尝试了不允许的部分模板专业化:
template<typename T, typename... Args> T create(Args&&... args)
{
return T(handle_,args...);
}
template<typename... Args> Block create<Block>(Args&&... args)
{
return Block(handle_,batch_,args...);
}
我尝试了完整的模板专业化,GCC 显然不支持可变参数模板:
template<typename T, typename... Args> T create(Args&&... args)
{
return T(handle_,args...);
}
template<> Block create<Block,int>(int n)
{
return Block(handle_,batch_,n);
}
那么我将如何创建一个像 create 这样的函数呢?
亲切的问候。