如何编写代码以在C ++中执行条件模板实例化

时间:2018-08-30 21:49:18

标签: c++ templates

我正在写一个在size_t上参数化的类模板

template<size_t k>
class MyClass {...}

在这种情况下,参数k实际上应该小于10,如果超出该范围,我希望它无法编译。在C ++ 11及更高版本中该怎么做?

MyClass<1> instance1; // ok
MyClass<2> instance2; // ok
MyClass<100> instance100; // fail to compile

3 个答案:

答案 0 :(得分:11)

使用static_assert

template<size_t k>
class MyClass {
    static_assert(k < 10, "Illegal k");
};

int main() {
  MyClass<50> t; //< Compile time failure
}

答案 1 :(得分:5)

您可以在模板参数中添加一个检查项,例如

template<size_t k, std::enable_if_t<k <= 10>* = nullptr>
class MyClass {};

这将允许MyClass<1> instance1;,但MyClass<100> instance100;将无法编译。

答案 2 :(得分:1)

如果使用的是C ++ 11,则可以使用std::enable_if

template<std::size_t k, typename unused = typename std::enable_if<k <= 10>::type>
class MyClass {};

如果能够使用C ++ 14或更高版本,则可以使用std::enable_if_t

template<std::size_t k, typename unused = std::enable_if_t<k <= 10 >>
class MyClass {};