是否可以跨静态断言维护状态
Can state be maintained across static asserts?
前段时间遇到这个需求,并被迫解决它。我想知道是否有一种方法可以在编译时检查时携带状态。
例如,一个激励的例子是如何设置计数器这样你就可以这样做:
static_assert(foo() == 0, "..");
static_assert(foo() == 1, "..");
static_assert(foo() == 2, "..");
每次后续调用将结果增加1。我对在编译时实现这一点特别感兴趣。我曾尝试将foo设置为具有内部计数器的constexpr,但随后遇到只读约束。我想知道在当前的c++标准中是否有可能实现这些。
int main() {
static constexpr int counter = 0;
struct test
{
constexpr int foo(){return counter++;}
};
test myTest;
static_assert(myTest.foo() == 0, "failed");
static_assert(myTest.foo() == 1, "failed");
return 0;
}
这在编译时是不可行的:
- 对象如
myTest
是在运行时实例化的。 - 对象可以通过引用或值传递给函数。当编译函数时,编译器不能确定它所引用的是哪个对象。
- 如果你的状态是对象独立的,如果它在编译时是可行的,那么状态将取决于每个单独编译单元中状态查询的遇到顺序,而不是执行流(例如,如果状态在循环中被引用,那么在整个循环中它将只有一个常量值,无论是否有1或1000次迭代)。
但是在运行时很容易,使用正常的变量和断言。
相关文章:
- 如何维护资源管理器项目视图中当前可见的项目列表
- 维护unordered_map但同时每一步都需要最低的映射值
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- C++ 使用增强正则表达式库时断言崩溃
- 从 exe 文件 (Visual Studio ) 启动时调试断言失败
- GCC,CMake,预编译标头和维护依赖项
- 如何将向量断言到特征矩阵
- OpenCV - Python 断言错误:SAD 算法 - 立体相机视差图计算
- Q没有管理权限的 exe 无法启动维护工具
- 使用 Google Test 对自定义断言函数进行单元测试
- 断言"id < 0"在Qt ActiveX中失败
- 初始值设定项列表构造和静态断言
- 在 CppUnit 中测试中止断言失败
- 使用扫描的调试断言失败
- MS 本机单元测试 - 断言::线程失败不起作用
- 如何断言 CRTP 的函数为最终函数?
- 迭代器跳闸视觉C++ 2017 断言
- 如何在 google test in windows 中管理断言
- 是否可以跨静态断言维护状态