是否可以在一个语句中创建一个对象并调用一个方法?

时间:2017-03-23 21:15:49

标签: c++ constructor

所以不要再次被指责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

1 个答案:

答案 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)

不知道为什么我昨晚没想到这个......