在c ++ 0x中编译模板参数的时间限制

时间:2018-06-26 17:49:51

标签: templates template-meta-programming c++03

这里是一个过于简化的类:

template <unsigned x>
class myArray {
    int getIndex(unsigned i) { return y[i]; }
    void setIndex(unsigned i, int v) { y[i] = v; }
  private:
    int y[x];
};

我将如何使用模板元编程来确保x小于64或任何任意值)?

我可以添加构造函数:

myArray () { if (x >= 64) { throw; } }

但这太可怕了...

是否有更优雅的方法来绑定模板参数,以便可以在编译时而不是在运行时对其进行检查?

  

注意::如果在c++03中可行,那么我需要该格式的语法(以防与c++11不同)。 / em>

更新

作为以下SO post提供的示例的派生,我得出了一个解决方案...

C compiler asserts - how to implement?

1 个答案:

答案 0 :(得分:2)

C ++ 11及更高版本

在C ++ 11和更高版本中,有一个static_assert声明用于此目的。然后,编译器会在编译时检查条件。您可以在表单范围的类范围内使用它

template <unsigned x>
class myArray {
    static_assert(x > 0 && x <= 64, "array size in (0, 64]");
};

在C ++ 11之前

在C ++ 11之前的版本中,有一些变通办法来提供与C ++ 11的static_assert相同的功能。这些解决方法中的大多数都基于以下思想提供了一个宏:如果您的检查(类型为bool的编译时表达式)产生false,则该宏将扩展为某些非法代码,从而产生编译错误。否则,宏将扩展为空字符串。高级实现允许您指定其他错误消息。如果您想使用现成的解决方案,则可以看看BOOST_STATIC_ASSERT