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()宏: #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) 不知道为什么我昨晚没想到这个…… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |