Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates C++;11类模板方法专用化和可变模板_Templates_C++11_Variadic Templates_Static If - Fatal编程技术网

Templates 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

我正在尝试使用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...);
    }
};
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)...);
}