所以不要再次被指责XY problem,这就是全貌:
我正在实施doctest,我想要的当前功能是INFO()
。它的工作原理如下:
int var1 = 1;
{
int var2 = 666;
INFO(var1 << "some string" << var2); // INFO is a macro
// random code...
CHECK(var1 == 42); // only if this fails should we see the INFO text
}
CHECK(var1 == 42); // INFO is scoped and should not be relevant here
这很容易。除了这个简单的行为之外,我还想要两件事:
INFO()
的少量变量) - 我想使用堆栈(使用类似小缓冲区优化的东西)。请注意,我保留了用于字符串化的对象的堆栈指针 - 而不是实际的字符串结果。同样在C ++ 11 rvalue引用的情况下,我删除operator<<
的{{1}}重载,因此没有rvalues可以绑定它 - 因为我正在保存指针。我已经完成了这两件事,但我注意到我的&&
宏不是单一的声明。这是一个交易破坏者 - 我无法将整个事物包装在INFO()
内以使其成为单个陈述,因为do { ... } while(false)
具有范围 - 这就是它的全部意义......
以下是INFO()
宏:
INFO()
我的竞争对手Catch将#define INFO_IMPL(name, x) InfoBuilder name; name << x
#define INFO(x) INFO_IMPL(anon_name, x)
宏实现为this之类的单个语句,但问题是INFO()
被调用的对象是一个被分配的临时对象到将在堆栈上的真实对象。
operator<<
这不是我的选择,因为我需要ScopedMessage anon_name = MessageBuilder() << x; // simplification
来电的堆栈空间。
如果我不使用堆栈,那么我将只有懒惰的字符串 - 但会有分配。
有没有办法在一个语句中构造一个对象并在其上调用一个方法?像这样:
operator<<
我也需要在C ++ 98中使用它。
我尝试了以下废话(将对范围对象的引用传递给分配给它的那个) - 这在C ++中无效...
InfoBuilder info() << x
答案 0 :(得分:0)
似乎没有办法在一个语句中创建对象并在其上调用方法。
可能的是创建X
类型的临时对象并在其上调用方法,然后可以将该方法的结果分配给类型为Y
的本地对象,只要Y
有适当的构造函数 - 就像这样:
Y lvalue = X() << arg1 << arg2;
但是为了解决我的问题,我完全按照@Remy Lebeau在评论中的建议做了 - 现在我和Catch的做法一样,但我也是&#34;窃取&#34;构造InfoBuilder
对象时临时InfoScope
的内容(小缓冲区) - 使用InfoBuilder
的复制构造函数。
#define INFO(x) InfoScope ANONYMOUS(_CAPTURE_)(InfoBuilder() << x)
不知道为什么我昨晚没想到这个......