gpt4 book ai didi

c++ - 如何编写接受断言消息的自定义断言函数 : assert(false) << "assertion" << "failed";

转载 作者:行者123 更新时间:2023-11-30 01:03:51 32 4
gpt4 key购买 nike

我想写一个像这样工作的断言函数:

//the following expression outputs "assertion failed" to std::err and then terminates the program
assert(false) << "assertion " << "failed";

我目前的情况是这样的:

#include <stdlib.h>
#include <iostream>
#include <string>

class AssertHelper
{
public:
AssertHelper(bool state):assert_state(state){};
AssertHelper operator<<(const std::string &mesg){
if(!assert_state){
std::cerr << mesg << std::endl;
std::cerr.flush();
exit(-1);
}
return *this;
};

private:
bool assert_state;
};

AssertHelper assert(bool cond){
return AssertHelper(cond);
}

int main(){
assert(false) << "assertion" << " failed";

}

但我的实现方式只显示消息“断言”的第一部分。如何在终止前打印消息的第二部分(可能还有第三、第四...)?

最佳答案

不要在每次将内容流式传输到对象时都检查断言。通过在 AssertHelper 中检查和刷新,使用您的对象将在语句末尾被销毁的事实。的析构函数。

你的 operator<<应该像这样简单:

AssertHelper& operator<<(const T &v) {
_message << v;
return *this;
}

请注意,您返回了对同一对象的引用,下一次调用 <<流入同一个对象!制作_message一个成员变量,您可以像 std::stringstream 一样流入其中.在析构函数中执行此操作:

~AssertHelper(){
if(!assert_state){
std::cerr << _message.str() << std::endl;
exit(-1);
}
}

关于c++ - 如何编写接受断言消息的自定义断言函数 : assert(false) << "assertion" << "failed";,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51890860/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com