-1

我正在尝试使用 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 这样的函数呢?

亲切的问候。

4

1 回答 1

0

尝试像这样利用SFINAE

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)...);
}
于 2015-04-26T14:55:59.367 回答