C++模板:如何在编译时加入非类型约束

Yan*_*Zhu 5 c++ templates

假设我有以下模板

template<unsigned char I, unsigned char F>
class FOO
{
   ....
}
Run Code Online (Sandbox Code Playgroud)

事实上,我要求(I> = F).如果有人误用了

FOO<1, 2> a;
Run Code Online (Sandbox Code Playgroud)

我希望提出编译错误.怎么做?

谢谢

Chr*_*ica 8

一种方法可能是C++ 11 static_assert,它类似于a assert,但在编译时检查:

template<unsigned char I, unsigned char F>
class FOO
{
    static_assert(I >= F, "I needs to be larger or equal to F");
    ...
};
Run Code Online (Sandbox Code Playgroud)

  • `static_assert`是一个声明.它可以出现在类范围内. (4认同)

Xeo*_*Xeo 6

如果你没有C++ 11,那么好的旧数组边界技巧也适用于此.只需将以下内容放在班级的私人部分:

static int const error_size = I >= F ? 1 : -1;
typedef char ERROR_I_must_not_be_less_than_F[error_size];
Run Code Online (Sandbox Code Playgroud)

只要I小于,就会触发"负数组大小"错误F.