将左移运算符 << 重载到对象

Overload left shift operator << to object

我无法重载左移运算符“<<”,因此我可以使用以下代码:

Foo bar;
bar << 1 << 2 << 3;

我的 class Foo 看起来像这样:

class Foo{
private:
    vector<int> list;
public:
    Foo();
    void operator<<(int input);
};

实现方式如下:

void Foo::operator<<(int input)
{
   // here i want to add the different int values to the vector 
   // the implementation is not the problem
}

代码无效 我收到错误“左操作数的类型为 'void'”。当我将 return 类型更改为 Foo& 时,它告诉我 return 某种类型 Foo。问题是我做不到。我缺少对象 bar.

的对象引用

我搜索了很多,但只找到描述输出到 cout 的运算符的页面。

要启用链接,您必须 return 来自操作员的引用。当你写

bar << 1 << 2 << 3;

实际上是

((bar << 1) << 2) << 3;

ie operator<<bar << 1 的结果上调用,参数为 2.

The problem is I can't. I am missing a object reference of the object bar.

您似乎没有注意到您的 operator<< 是一个成员函数。在 bar 的成员函数中 *this 是对 bar 对象的引用:

#include <vector> 
#include <iostream>

class Foo{
private:
    std::vector<int> list;
public:
    Foo() {}
    Foo& operator<<(int input);
    void print() const { for (const auto& e : list) std::cout << e << ' ';}
};

Foo& Foo::operator<<(int input)
{
    list.push_back(input);
    return *this;
}

int main() {
    Foo bar;
    bar << 1 << 2 << 3;
    bar.print();
}

PS:虽然 bar << 1 << 2 << 3; 等结构可以在早于 C++11 的几个库中找到,但如今它看起来有点过时了。您宁愿使用列表初始化或提供 std::initializer_list<int> 构造函数来启用 Foo bar{1,2,3};.