我正在写一个在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
答案 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 {};