繁体   English   中英

如何编写一个接受断言消息的自定义断言函数,如下所示:assert(false)<<“ assertion” <<“ failed”;

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM