我正在尝试编写一个宏,在字符串的末尾添加一个char(结束函数键)而不传递源字符串。
声明:
LEVEL_ENTRY(level) << "Level1 Message";
预期的宏观扩张
LEVEL_ENTRY(level) levelParser(level, std::ostringstream().flush() << "Level1 Message");
我正在尝试这样
#define LEVEL_ENTRY(level) levelParser(level, std::ostringstream().flush()
使用C ++宏可以实现这种扩展(不通过args)吗?
修改
目前我正在做的工作
#define LEVEL_ENTRY(level, msg) levelParser(level, std::ostringstream().flush() << msg)
LEVEL_ENTRY(level, "Level1 Message"<< "Message2");
真正的问题是我现在不能简单地改变声明'它在项目的1000多个地方使用。
答案 0 :(得分:3)
不,你不能<<
宏的事情。宏由预处理器处理,C ++语言解析器不会看到,并且宏不支持任何类型的<<
语法。
宏是代号的片段,它已被赋予名称。每当使用该名称时,它将被宏的内容替换。有两种宏。它们的区别主要在于它们在使用时的外观。类似对象的宏在使用时类似于数据对象,类似函数的宏类似于函数调用。
答案 1 :(得分:2)
当然,但没有涉及宏:
class LEVEL_ENTRY {
public:
LEVEL_ENTRY(level): level_(level) {}
LEVEL_ENTRY(LEVEL_ENTRY const &) = delete;
LEVEL_ENTRY & operator=(LEVEL_ENTRY const &) = delete;
~LEVEL_ENTRY() {
levelParser(level, oss);
}
LEVEL_ENTRY & operator<<(const char *message) {
oss << message;
}
private:
int level_;
std::ostringstream oss;
};
LEVEL_ENTRY(1) << "Level1 Message";
答案 2 :(得分:2)
解决问题的一种方法是:
struct Foo { int level; };
auto operator<<(Foo foo, char const *s)
{
return levelParser(foo.level, std::ostringstream().flush() << s);
}
#define LEVEL_ENTRY(level) Foo{level}