C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 是否可以在一个语句中创建一个对象并调用一个方法?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
因此,不要再次被指控为 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 – 是否可以在一个语句中创建一个对象并调用一个方法?所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。