如何将std :: enable_if与variadic模板一起使用

时间:2014-07-09 16:24:24

标签: c++ templates c++11 variadic-templates

我正在尝试创建一个Tensor类(对于那些不知道这是多维数组的数学等价物的人),我希望只允许它编译,如果实例化的类型满足某些类型特征。

通常,我会这样做:

template <typename T, std::size_t Size, typename Enable = void>
class Foo;

// Only allow instantiation of trivial types:
template <typename T, std::size_t Size>
class Foo<T, Size, typename std::enable_if<std::is_trivial<T>::value>::type>
{
     // Implement stuff...
};

但是,我需要一个未知数量的模板参数来指定张量对象的每个维度的边界,如下所示:

template <typename T, std::size_t... Sizes, typename Enable = void>
class CTensor;

template <typename T, std::size_t Sizes>
class CTensor<T, Sizes..., typename std::enable_if<std::is_trivial<T>::value>::type>
{
     // Implement stuff...
};

但是,由于可变参数模板参数Sizes...,这不起作用。我希望能够如下实例化CTensor对象:

CTensor<int, 3, 4, 5> testTensor; // Compiles fine and produces a rank 3 tensor
CTensor<ComplexClass, 3, 4, 5> testTensor2; // Produces a compile-time error

实现这一目标的最佳方式是什么?

2 个答案:

答案 0 :(得分:4)

为什么要在课堂上使用enable_if?它的目的是在过载查找期间不显示功能。如果您要做的只是声明始终满足某些条件,请使用static_assert

template <typename T, std::size_t...Sizes>
class CTensor
{
     static_assert(std::is_trivial<T>::value, "T required to be a trivial type");
};

答案 1 :(得分:3)

如何不使用enable_if?这不是它的意思(SFINAE)。看起来你要做的就是静态断言:

template <typename T, std::size_t... Sizes>
class CTensor
{
    static_assert(std::is_trivial<T>::value, "expecting trivial type blah blah");
};