【发布时间】:2015-11-26 04:12:24
【问题描述】:
我想使用 static_assert 对我的类的配置实施各种限制。早些时候,我只使用一个枚举,并且只允许一个需要所述枚举的构造函数来对我的类实施限制。如果我有类似下面的东西并且范围是从 0 到 4,这工作得很好,但是一旦我有 0 到 500 的范围,那么使用枚举就会变得笨拙。
Some_Class.h
class Some_Class {
public:
Some_Class(const unsigned int param);
private:
const unsigned int member_param;
};
Some_Class.cpp
Some_Class::Some_Class(const unsigned int param) : member_param(param) {
static_assert(member_param < 500, "Param must be less than 500.");
};
Main.cpp
Some_Class foo4(125); // OK
Some_Class foo5(500); // Should fail at compile time.
这是 GCC 在使用 C++14 编译时向我抛出的问题:
1> Some_Class.cpp: In constructor 'Some_Class::Some_Class(unsigned int)':
1>C:\some_path\Some_Class.cpp(3,2): error : non-constant condition for static assertion
1> static_assert(member_param < 500, "Param must be less than 500.");
1> ^
1>C:\some_path\Some_Class.cpp(3,2): error : use of 'this' in a constant expression
【问题讨论】:
-
如果有人
Some_Class foo6(getCurrentTimeInMilliseconds() % 1000);怎么办? -
静态断言在编译时执行。函数参数在运行时传递。我建议使用常规断言。
-
啊,该死,我才意识到。有没有办法在编译时强制对构造函数进行函数参数检查,或者这实际上只是保证一个新问题?也许以某种方式抛出 constexpr 可能会有所帮助。
-
@NeilKirk 我在一个相对最小的嵌入式系统上,因此即使经过优化,assert 添加的大约 4KB 的代码对于我的环境来说也太多了。我希望使用 static_assert,因为根据我的理解,它应该引入最小(如果不是零)额外代码大小。
-
什么?断言通常在发布版本中被禁用。 4kb 是从哪里来的?
标签: c++ c++11 enums c++14 static-assert