c++ - 在可能的情况下扩展为 static_assert 的断言宏?

标签 c++ assert static-assert

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

template<typename T>
void foo(T t) {
  assert(t.member_function() == 10);
}

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

最佳答案

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

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

需要variable length arrays ,也许还有其他编译器特定的东西。我在 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);
}

关于c++ - 在可能的情况下扩展为 static_assert 的断言宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18216276/

相关文章:

c++ - 运行 SDL2 时 Xcode 崩溃

c++ - 在 Release模式下是否忽略了 assert(false)?

exception - 试图组合一些断言函数,但我无法尝试工作

c++ - 如何在编译时检查类是否是抽象的?

c++ - 调用 const 函数地址传递给 gcc 内联汇编器 (avr-gcc)

c++ - Apache Kafka 可以与 C++ 一起使用吗?

c++ - copy_n 还是直到eof?

c# - 使用 Selenium webdriver C# 为只读字段断言值

c++ - 如何使用类型特征仅比较具有多个参数的类中的第一个模板参数?

c++ - 静态断言意外行为