一个断言宏,在可能的情况下扩展为static_assert?

Pub*_*bby 5 c++ assert static-assert

我有一些通用代码需要对成员函数的结果运行断言.该成员函数可以是constexpr,也可以不是.

template<typename T>
void foo(T t) {
  assert(t.member_function() == 10);
}
Run Code Online (Sandbox Code Playgroud)

因为t.member_function() 可能是一个常量表达式,我想知道static_assert在这种情况下是否可以将其视为a ,但是否则默认为正常assert.这可能吗?

Aar*_*aid 2

这是一个有点疯狂的解决方案。

取消注释该Const c; foo(c);行,您会发现它无法编译。这是编译时断言。

它需要可变长度数组,也许还需要其他编译器特定的东西。我使用的是 g++-4.6。

数组的大小为 0 或 -1,具体取决于成员函数是否返回 10。因此,如果可以在编译时计算它,则编译器会意识到它是一个非可变长度数组,并且它的大小为负数。负尺寸让它可以抱怨。否则,它就会落入传统的断言。

请注意:在运行时断言失败后,我得到了一些运行时版本的核心转储。也许它不喜欢尝试具有free负大小的数组。更新:我收到任何断言失败的核心转储,甚至是int main() {assert (1==2);}. 这是正常的吗?

#include <iostream>
#include <cassert>
using namespace std;

struct Const {
        constexpr int member_function() { return 9; }
};
struct Runtime {
                  int member_function() { return 9; }
};

template<typename T>
void foo(T t) {
        if(0) {  // so it doesn't actually run any code to malloc/free the vla
            int z[(t.member_function()==10)-1]; // fails at compile-time if necessary
        }
        assert(t.member_function()==10);
}


int main() {
        //Const c; foo(c);
        Runtime r; foo(r);
}
Run Code Online (Sandbox Code Playgroud)