这里是一个过于简化的类:
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提供的示例的派生,我得出了一个解决方案...
答案 0 :(得分:2)
在C ++ 11和更高版本中,有一个static_assert
声明用于此目的。然后,编译器会在编译时检查条件。您可以在表单范围的类范围内使用它
template <unsigned x>
class myArray {
static_assert(x > 0 && x <= 64, "array size in (0, 64]");
};
在C ++ 11之前的版本中,有一些变通办法来提供与C ++ 11的static_assert
相同的功能。这些解决方法中的大多数都基于以下思想提供了一个宏:如果您的检查(类型为bool
的编译时表达式)产生false
,则该宏将扩展为某些非法代码,从而产生编译错误。否则,宏将扩展为空字符串。高级实现允许您指定其他错误消息。如果您想使用现成的解决方案,则可以看看BOOST_STATIC_ASSERT
。