一个断言宏,在可能的情况下扩展为static_assert
An assert macro which expands to static_assert when possible?
我有一些通用代码,需要对成员函数的结果运行断言。此成员函数可能是constexpr
,也可能不是。
template<typename T>
void foo(T t) {
assert(t.member_function() == 10);
}
因为t.member_function()
可能是一个常量表达式,我想知道在这种情况下是否有可能被视为static_assert
,但在其他情况下默认为正常的assert
。这可能吗?
这是一个有点疯狂的解决方案。
取消对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);
}
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 扩展基类并在不更改派生类的情况下使用该功能
- 如何在不使用文件扩展名的情况下使用命令行参数打开C++中的文本文件?
- 是否可以在不扩展初始宏的情况下将一个宏作为参数提供给另一个宏?
- 如何在不扩展的情况下基于 RHIDE 中的环境变量添加包含目录
- 我如何在不使用扩展名的情况下给出命令行参数,而不是./a.out 3 4,而是./a 3 4
- 我无法在不违反 c++ 扩展规则的情况下制作匹配的构造函数
- 具有扩展接口的派生类的集合.如何在没有动态强制转换的情况下访问派生接口
- 一个断言宏,在可能的情况下扩展为static_assert
- 我可以在不使用include的情况下扩展头文件中的类吗
- 未使用的私有虚拟方法是否允许在不破坏ABI兼容性的情况下进行未来扩展
- 在x64平台上的GCC中,默认情况下为扩展精度
- 是否有可能在不使用指针的情况下将变量的作用域扩展到if语句之外?
- 在基类和扩展类之间存在关系的情况下,没有匹配函数错误
- 嵌入的铬 - 在不扩展类C++的情况下修改虚拟方法参数值
- 可以在不重新编译客户端代码的情况下扩展虚拟接口吗?