在网上某个地方看C++代码时,我注意到了一段这样的代码

 opts.addOptions()(cOSS.str(), m_list, XYentry());

我对该代码的实现方式印象深刻,当然也想知道它是如何工作的。

所以我试图复制这种类型的调用:
#include "stdafx.h"
#include "iostream"


using namespace std;

class mypair {
public:

    int x;
    int y;

    mypair() {

        x = 0;
        y = 0;
    }

    void operator()(int x1, int y1) {
        x = x1;
        y = y1;
        cout << "x=" << x << "  y=" << y << endl;
    }

};



struct myrot {
    int     left;
    int     right;
    int     result;
    mypair  g;

    mypair  addOptions() {

        g.x = 3;
        g.y = 3;
        cout << "g.x=" << g.x << endl;
        cout << "g.y=" << g.y << endl;
        return g;
    };

    void print_mypair() {

        cout << "g.x=" << g.x << endl;
        cout << "g.y=" << g.y << endl;

    }

    void operator()(int y) { result = y; }
    void operator() (void) {
        cout << "g.x=" << g.x << endl;
        cout << "g.y=" << g.y << endl;

    }


};

int main()
{


    myrot    t1;
    mypair  res;

    t1.left = 2;
    t1.right = 5;

    t1.addOptions()(5,5);
    t1.print_mypair();
    cout << "t1.g.x=" << t1.g.x << endl;

    return 0;
}

至少在语法级别上,调用t1.addOptions()(5,5);似乎几乎相同。所以我的问题是:

1)有没有这种 call 的名称?
2)它是如何工作的?如果删除成员函数addOptions中的返回类型,则会收到错误消息。另外,如果将t1.addOptions()(5,5);更改为res = t1.addOptions()(5,5);,其中res被声明为mypair,那么我也会收到错误消息。在addOption之后调用void operator()(int x1, int y1),但最后g.x和g.y的值均为3而不是值5。

那么,有人可以解释一下这里的实际情况吗?

最佳答案

您的声明

t1.addOptions()(5,5);

基本上是这样的:
{
    mypair temp_variable = t1.add_options();
    temp_variable(5, 5);
}

注意,由于myrot::addOptions按值返回mypair对象,因此在mypair::operator()成员变量的副本上调用myrot::g函数。如果要修改myrot::g变量,则必须通过引用返回:
mypair& addOptions() { ... }

然后,等效代码变为
{
    mypair& temp_variable = t1.add_options();
    temp_variable(5, 5);
}

10-04 20:51