Jas*_*n S 33 c++ compiler-construction
有没有办法可以断言两个常量表达式在编译时是相等的?
例如,我希望这会导致编译时错误
enum { foo=263, bar=264 };
SOME_EXPRESSION(foo,bar)
Run Code Online (Sandbox Code Playgroud)
但我希望这不会导致错误
enum { foo=263, bar=263 };
SOME_EXPRESSION(foo,bar)
Run Code Online (Sandbox Code Playgroud)
编辑:上面简化了.我的情况更像是
some_other_file_I_dont_control.h:
class X
{
public:
enum { foo=263 };
}
Run Code Online (Sandbox Code Playgroud)
my_file.h:
enum { bar=something+somethingelse }; // bar should equal X::foo
SOME_EXPRESSION(X::foo, bar)
Run Code Online (Sandbox Code Playgroud)
Cha*_*had 35
是.您可以使用类型bool上的模板特化来执行此操作,如下所示:
// empty default template
template <bool b>
struct StaticAssert {};
// template specialized on true
template <>
struct StaticAssert<true>
{
static void assert() {}
};
int f()
{
StaticAssert<1==1>::assert(); // compiles fine, assert() member found
StaticAssert<1==2>::assert(); // compile failure, no assert() member for StaticAssert<false>
}
Run Code Online (Sandbox Code Playgroud)
代码基本上来自内存,可能需要一些调整.
Meh*_*dad 33
请参阅static_assert(仅限C++ 0x); 如果是旧版本,请参阅Boost'sStaticAssert.
Dav*_*eas 22
对于静态断言的另一个版本,您可以通过添加更好的名称来赞美,您可以使用:
// name must be a valid identifier
#define STATIC_ASSERT( condition, name )\
typedef char assert_failed_ ## name [ (condition) ? 1 : -1 ];
Run Code Online (Sandbox Code Playgroud)
用作:
STATIC_ASSERT( x == y, constants_must_be_same );
Run Code Online (Sandbox Code Playgroud)
编译器将触发类似于以下的错误:
size of array 'assert_failed_constants_must_be_same' is negative
Run Code Online (Sandbox Code Playgroud)
哪个看起来没有用,但是它会指向断言的确切行,过一会儿你将开始处理该错误消息,因为静态断言失败
还有使用switch (..)语句的技巧。虽然有点老式。case 条目 foo == bar 必须在编译时进行评估,如果它恰好为 false,则 switch 语句将导致错误。编译器也会将其减少为“无”。
{
bool x=false;
switch (x) {
case foo == bar:
break;
case false:
// Compile time test that foo == bar
break;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37360 次 |
| 最近记录: |