我正在尝试创建一个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
实现这一目标的最佳方式是什么?
答案 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");
};