在命名对象的构造函数中链接调用成员函数

9

首先,我不是在谈论C++11构造函数链(即构造函数委托)。

类成员函数可以返回对自己(即该类)的引用,因此可以进行函数调用链。(就像cout<<运算符如何允许链式调用一样。)

在实例化匿名对象时,这种链式调用可以发生在构造函数之外。

能否在命名对象的构造函数中进行链式调用?下面的“foo a”和“foo b”行不会编译,因此我想知道是否有不同的语法。

#include <iostream>
using namespace std;

class foo {
   public:
      foo(int x) : val{x} { };
      foo& inc() { ++val; return *this; }
      int getVal() { return val; };
   private:
      int val;
};

int main() {
   cout << foo(1).inc().getVal() << endl; // prints 2
   cout << foo{2}.inc().inc().inc().inc().getVal() << endl; // prints 6
   foo a(3).inc(); // error: expected ‘,’ or ‘;’ before ‘.’ token
   foo b{4}.inc(); // error: expected ‘,’ or ‘;’ before ‘.’ token
   cout << a.getVal() << endl;
   cout << b.getVal() << endl;
}

3
基本上是“不”。foo(1)是一个表达式,foo a(3)不是一个表达式。你需要编写foo a(3); a.inc(); - M.M
2个回答

4
我认为这是几乎总是自动化风格的优势之一。如果你习惯于写作以下内容:
auto a = foo{3};

然后,您可以在不一致的情况下链接调用:
auto a = foo{3}.inc();

3
您可以通过链式初始化实现类似的效果:
foo c = foo{5}.inc().inc();

令人惊讶的是,我的编译器将其优化为一个常量,因此不会有性能损失。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接