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

dhu*_*dhu 4 c++ templates

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

template<size_t k>
class MyClass {...}
Run Code Online (Sandbox Code Playgroud)

参数k应该真的小于10,在这种情况下,如果它超出了这个范围,我希望它不能编译.我怎么能在C++ 11及更高版本中做到这一点?

MyClass<1> instance1; // ok
MyClass<2> instance2; // ok
MyClass<100> instance100; // fail to compile
Run Code Online (Sandbox Code Playgroud)

cpl*_*rat 11

使用 static_assert

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

int main() {
  MyClass<50> t; //< Compile time failure
}
Run Code Online (Sandbox Code Playgroud)

  • 我投票赞成这个答案.虽然我发现SFINAE(例如`std :: enable_if`)非常有趣,但它的可读性较差,编译时错误并不像使用`static_assert`那样清晰. (3认同)

Nat*_*ica 5

您可以在模板参数中添加一个检查

template<size_t k, std::enable_if_t<k <= 10, bool> = true>
class MyClass {};
Run Code Online (Sandbox Code Playgroud)

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