【问题标题】:Chain-calling member functions off a constructor of a named object从命名对象的构造函数中链式调用成员函数
【发布时间】:2017-02-02 14:30:31
【问题描述】:

首先,我不是在谈论 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;
}

【问题讨论】:

  • 基本上“不”。 foo(1) 是一个表达式,foo a(3) 不是一个表达式。你必须写foo a(3); a.inc();

标签: c++ c++11 chaining method-chaining


【解决方案1】:

我认为这是Almost Always Auto 风格的优点之一。如果你有写作的习惯:

auto a = foo{3};

那么你可以链式调用而不会出现不一致:

auto a = foo{3}.inc();

【讨论】:

    【解决方案2】:

    你可以获得类似的链接初始化的效果:

    foo c = foo{5}.inc().inc();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 2022-01-23
      • 2011-12-07
      • 2018-05-13
      • 1970-01-01
      • 2012-01-10
      相关资源
      最近更新 更多