[英]How to write a custom assert function that accepts assert messages like this: assert(false) << “assertion” << “ failed”;
我想编写一个像这样的断言函数:
//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);
}
}
最小校正:
const AssertHelper& operator<<(const std::string& mesg) const
{
if (!assert_state)
std::cerr << mesg;
return *this;
};
~AssertHelper()
{
if (!assert_state)
{
std::cerr << std::endl;
exit(-1);
}
}
备注: operator<<
应该返回引用,而不是值; bool assert_state;
可以标记为const
; 在<< std::endl
之后调用flush()
是多余的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.