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

c – 是否可以在一个语句中创建一个对象并调用一个方法?,第1张

概述因此,不要再次被指控为 XY problem,这是完整的图片: 我正在实现doctest,我想要的当前功能是INFO().它的工作原理如下: int var1 = 1;{ int var2 = 666; INFO(var1 << "some string" << var2); // INFO is a macro // random code... CHECK(v 因此,不要再次被指控为 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引用的情况下,我删除了运算符<<过载和&&所以没有rvalues可以绑定它 - 因为我正在保存指针.
我已经完成了这两件事,但我注意到我的INFO()宏不是单个语句.这是一个交易破坏者 – 我无法将整个事物包含在do {…} while(false)中以使其成为单个语句,因为INFO()是作用域的 – 这就是它的全部要点……

这是INFO()宏:

#define INFO_IMPL(name,x) InfoBuilder name; name << x#define INFO(x) INFO_IMPL(anon_name,x)

我的竞争对手Catch将INFO()宏实现为像this这样的单个语句,但问题是运算符<<被调用是一个临时的,被分配给将在堆栈上的真实对象.

ScopedMessage anon_name = MessageBuilder() << x; // simplification

这不是我的选择,因为我需要运算符的堆栈空间<<调用. 如果我不使用堆栈,那么我将只有懒惰的字符串 – 但会有分配. 有没有办法在一个语句中构造一个对象并在其上调用一个方法?像这样的东西:

InfoBuilder info() << x

而且我在C 98中也需要这个.

我尝试了下面的废话(将对范围对象的引用传递给分配给它的那个) – 这在C中不起作用…

struct Y;struct X {    X(Y&){}};struct Y {    Y(X&,int){}};int main() {    X x(Y(x,6));}
解决方法 似乎没有办法在一个语句中创建对象并在其上调用方法.

可能的是创建一个X类型的临时对象并在其上调用一个方法,然后只要Y具有相应的构造函数,该方法的结果就可以分配给Y类型的本地对象 – 如下所示:

Y lvalue = X() << arg1 << arg2;

但是为了解决我的问题,我完全按照@Remy Lebeau在评论中的建议 – 现在我的做法和Catch一样,但是在构建InfoScope时我也“窃取”临时InfoBuilder的内容(小缓冲区) object – 使用InfoBuilder的复制构造函数.

#define INFO(x) InfoScope ANONYMOUS(_CAPTURE_)(InfoBuilder() << x)

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

总结

以上是内存溢出为你收集整理的c – 是否可以在一个语句中创建一个对象并调用一个方法?全部内容,希望文章能够帮你解决c – 是否可以在一个语句中创建一个对象并调用一个方法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225027.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存