Templates C++;11类模板方法专用化和可变模板
我正在尝试使用GCC和C++11构建以下类型的模板化方法:Templates C++;11类模板方法专用化和可变模板,templates,c++11,variadic-templates,static-if,Templates,C++11,Variadic Templates,Static If,我正在尝试使用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
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...);
}
};
class-Foo
{
私人:
//设备手柄
cudnhandle\u t handle\u;
//批量大小
std::向量批处理;
公众:
Foo(cudnnHandle_t handle,std::vector batch):handle_(handle),batch_(batch){
模板T创建(参数&&…参数)
{
if(std::is_base_of::value)
返回T(句柄、参数…);
if(std::is_same::value)
返回T(句柄、批处理、参数…);
}
};
但是,由于返回语句的原因,无法编译。如果T是Block,则返回T(句柄,参数…)将失败,如果T是元素基类型,则返回T(句柄,批处理,参数…)将失败
我尝试了不允许的部分模板专门化:
模板T创建(Args&&…Args)
{
返回T(句柄、参数…);
}
模板块创建(Args&&…Args)
{
返回块(句柄、批处理、参数…);
}
我尝试了完全模板专门化,这显然是GCC不支持可变模板的:
模板T创建(Args&&…Args)
{
返回T(句柄、参数…);
}
模板块创建(int n)
{
返回块(手柄、批次、n);
}
那么我如何创建像create这样的函数呢?
亲切问候。试着利用这样的机会
template <typename T, typename... Args,
typename std::enable_if<std::is_base_of<Element, T>::value>::type* = nullptr>
T create(Args&&... args) {
return T(handle_, std::forward<Args>(args)...);
}
template <typename T, typename... Args,
typename std::enable_if<std::is_same<Block, T>::value>::type* = nullptr>
T create(Args&&... args) {
return T(handle_, batch_, std::forward<Args>(args)...);
}
模板
T创建(Args&&…Args){
返回T(句柄,标准::向前(参数)…);
}
模板
T创建(Args&&…Args){
返回T(句柄、批处理、标准::转发(args)…);
}
编译器的错误消息是什么?工作非常出色!谢谢
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);
}
template <typename T, typename... Args,
typename std::enable_if<std::is_base_of<Element, T>::value>::type* = nullptr>
T create(Args&&... args) {
return T(handle_, std::forward<Args>(args)...);
}
template <typename T, typename... Args,
typename std::enable_if<std::is_same<Block, T>::value>::type* = nullptr>
T create(Args&&... args) {
return T(handle_, batch_, std::forward<Args>(args)...);
}