C++ lambda能代替getter吗?

C++ lambda能代替getter吗?,c++,oop,lambda,c++11,getter,C++,Oop,Lambda,C++11,Getter,下面是一个典型的类示例,该类的字段有两个getter: class point { int x_, y_; public: point(int x, int y) : x_(x), y_(y) {} int x() const { return x_; } int y() const { return y_; } }; int main() { point p(1, 2);

下面是一个典型的类示例,该类的字段有两个getter:

class point
{
    int x_, y_;

public:

    point(int x, int y) : x_(x), y_(y) {}

    int x() const
    {
        return x_;
    }

    int y() const
    {
        return y_;
    }
};

int main()
{
    point p(1, 2);
    std::cout << p.x() << ", " << p.y() << '\n';
}
有人可能会争辩说,将点打印到输出流实际上应该由超负荷的运算符提供 在C++98中,这太笨拙了

实际上,至少在c++03中是很容易的:

class point
{
    int x_, y_;

public:

    point(int x, int y) : x_(x), y_(y) {}

    template<typename Fun>
    void operator()(Fun fun) const
    {
        fun(x_, y_);
    }
};

void foo(int,int)
{
}

int main()
{
    point p(3, 4);
    p(&foo);
}
在C++98中,这太笨拙了

实际上,至少在c++03中是很容易的:

class point
{
    int x_, y_;

public:

    point(int x, int y) : x_(x), y_(y) {}

    template<typename Fun>
    void operator()(Fun fun) const
    {
        fun(x_, y_);
    }
};

void foo(int,int)
{
}

int main()
{
    point p(3, 4);
    p(&foo);
}
在我看来,必须围绕一些代码编写lambda,而不是仅仅编写代码,这仍然是个难题

拥有单独的访问器和使用单独的访问器之间的唯一区别是,类可以假定值总是一起访问。这可能会提供新的方法来生成这些值,如果每个值都必须单独生成,这是不可能的。例如,一次请求两个值可能比一个值请求两个要便宜得多

对于Point这样的许多类来说,后者几乎是不可能的,因为在Point中,以更复杂的使用为代价并没有真正的收益

在我看来,必须围绕一些代码编写lambda,而不是仅仅编写代码,这仍然是个难题

拥有单独的访问器和使用单独的访问器之间的唯一区别是,类可以假定值总是一起访问。这可能会提供新的方法来生成这些值,如果每个值都必须单独生成,这是不可能的。例如,一次请求两个值可能比一个值请求两个要便宜得多



后者对于许多类来说几乎不是这样,例如Point,在那里,以更复杂的使用为代价并没有真正的收益。

我不太明白它赢得了什么,当然这是lambdas的一个很酷的使用,但它似乎一点也没有赢得多少。@Charles:因为很少允许从类外更改字段。记住,point课程只是一个例子。你在这里得到了什么?代码仍然取决于这些变量是否可用以及是否具有预期的含义。@Mankarse:不,我可以随时选择不同的字段集。那时我所要改变的就是恐惧,是;行,客户端仍然可以工作。@fredfolflow:所以。。。假设要将其更改为三维点而不是二维点。为此,您必须添加一个z_u变量。突然之间,执行打印的每个lambda都必须更新以包含这个额外的点。您提供的用my字段调用任意函数的抽象不是特别有用的。更好的方法可能是向应该打印的字段提供某种元组接口,然后让打印机/格式化程序完成该抽象。我不太明白它会赢得什么,当然这是lambdas的一种很酷的用法,但是它似乎一点也没有赢得多少胜利。@Charles:因为字段应该很少被允许在课外更改。记住,point课程只是一个例子。你在这里得到了什么?代码仍然取决于这些变量是否可用以及是否具有预期的含义。@Mankarse:不,我可以随时选择不同的字段集。那时我所要改变的就是恐惧,是;行,客户端仍然可以工作。@fredfolflow:所以。。。假设要将其更改为三维点而不是二维点。为此,您必须添加一个z_u变量。突然之间,执行打印的每个lambda都必须更新以包含这个额外的点。您提供的用my字段调用任意函数的抽象不是特别有用的。更好的方法可能是向应该打印的字段提供某种元组接口,然后让打印机/格式化程序完成该抽象。应该很少允许从类外更改字段。point类只是一个例子,实际上,VJovic在这个例子中是正确的。class vs struct的答案取决于您打算如何使用成员。若您打算完全封装该点,这样就并没有人知道它的内部结构,那个么您可以使用一个类。如果你想把它当作只有getter和setter的数据结构来使用,你应该用struct来代替。你声称你的C++03函子很简单,但这并不重要,OP声称它很笨拙,而不是很难。考虑到您的“解决方案”定义不当,而且还不完全清楚,例如,它使用了什么样的链接,我看不出它如何不比C++11 lambda定义的内联(没有链接)更笨拙。甚至没有提到样板文件与代码的比率。此外,我认为在这里公开成员是有点离题的。只有在回答为什么我们需要获得者/设置者这个问题时,这个答案才是好的?我们只是不需要他们。但是这个问题可以用不同的方式来回答,而且根本不讨论它似乎是不对的。字段应该很少被允许在课外更改。point类只是一个例子实际上,
维约维奇在这件事上是对的。class vs struct的答案取决于您打算如何使用成员。若您打算完全封装该点,这样就并没有人知道它的内部结构,那个么您可以使用一个类。如果你想把它当作只有getter和setter的数据结构来使用,你应该用struct来代替。你声称你的C++03函子很简单,但这并不重要,OP声称它很笨拙,而不是很难。考虑到您的“解决方案”定义不当,而且还不完全清楚,例如,它使用了什么样的链接,我看不出它如何不比C++11 lambda定义的内联(没有链接)更笨拙。甚至没有提到样板文件与代码的比率。此外,我认为在这里公开成员是有点离题的。只有在回答为什么我们需要获得者/设置者这个问题时,这个答案才是好的?我们只是不需要他们。但是这个问题可以用不同的方式来回答,根本不讨论它似乎是不对的。
struct point
{
  int x;
  int y
};
p([](int x, int y){
    std::cout << x << ", " << y << '\n';
});