延迟评估和/或灵活的宏名称

时间:2015-01-27 21:50:48

标签: c++ logging macros lazy-evaluation c++03

我有一个简单的单头日志库。我想"嵌入"它写入我编写的其他库中,以便用户可以选择性地打开应用程序不同部分的日志记录。我不想添加任何依赖项,这就是为什么单标题性质如此吸引人的原因。为了使同一个日志库的不同副本不会相互冲突,我可以将单个副本放在目标库的命名空间中,隔离需要隔离的所有内容。那部分很简单。

然而,有一个问题。日志记录库有一个宏LOG_SEV(severity),实际上用于将消息粘贴到特定的流中。宏的原因是我需要预先设置某种if (logging conditions hold) ...以确保对消息进行惰性评估。

作为一个宏,它污染了全局命名空间,我至少得到了警告消息(可能还有冲突)。我想知道是否有解决这个问题的办法。要么采用其他方式进行延迟评估(使用C ++ 03,而不是C ++ 11),要么使用目标库名称扩充宏名称,将LOG_SEV(severity)转换为LOG_SEV_mylib(severity)。或者这是绝望的吗?

1 个答案:

答案 0 :(得分:1)

C ++ 03(或更高版本)可以使用 boost::proto 生成尚未评估的表达式对象。

他们的"hello world" example(逐字逐句)接近你所描述的内容。

想象一下evaluate函数中的日志记录条件

#include <iostream>
#include <boost/proto/proto.hpp>
#include <boost/typeof/std/ostream.hpp>
using namespace boost;

proto::terminal< std::ostream & >::type cout_ = { std::cout };

template< typename Expr >
void evaluate( Expr const & expr )
{
    proto::default_context ctx;
    proto::eval(expr, ctx);
}

int main()
{
    evaluate( cout_ << "hello" << ',' << " world" );
    return 0;
}