惰性计算和/或灵活的宏名称

Lazy evaluation and/or flexible macro names

本文关键字:计算      更新时间:2023-10-16

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

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

作为一个宏,它会污染全局命名空间,我至少会收到警告消息(可能还有冲突)。我想知道是否有解决这个问题的方法。要么是执行延迟求值的其他方法(在 C++03 中,而不是 C++11),要么是使用目标库名称扩充宏名称的某种方法,将LOG_SEV(severity)变成LOG_SEV_mylib(severity)。还是这是绝望的?

C++03(或更高版本)可以使用 boost::p roto 生成尚未计算的表达式对象。

他们的"hello world"示例(逐字,如下)与您描述的非常接近。

想象一下您在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;
}