如何使用提取运算符从 C++ 中的 class 方法获取多个值?

How to use extraction operator to get multiple values from method of a class in C++?

就像我们在 cin 中使用的那样:

cin >> a >> b;

从输入流中获取多个值并将它们插入到多个变量中。 我们如何在自己的 class 中实现此方法?从中获取多个值。 我试了一下发现 here:

#include <iostream>
using namespace std;

class example {
    friend istream& operator>> (istream& is, example& exam);
    private:
        int my = 2;
        int my2 = 4;
};

istream& operator>> (istream& is, example& exam) {
    is >> exam.my >> exam.my2;
    return is;  
}

int main() {
    example abc;
    int s, t;

    abc >> s >> t;
    cout << s << t;
}

但是出现错误"no match for operator>> (operand types are 'example' and 'int')"

PS:我知道其他方法,但我想知道具体的方法,谢谢。

您想将 example 中的数据提取到 int 中。相反,您编写代码将数据从 istream 提取到 example。这就是找不到正确函数的原因:你没有写一个。

如果你真的想让 abc >> s >> t 工作,你将不得不定义一个 operator>>(example&, int&) 并将 stream/cursor 语义添加到你的 class,以跟踪到目前为止提取的内容的每个步骤。这听起来真的很麻烦。

您定义的插入运算符使用 std::istream 作为源而不是您拥有的 class。虽然我认为你的 objective 是不明智的,但你可以为你的 class 创建类似的运算符。您需要一些具有合适状态的实体,因为链式运算符应提取不同的值。

我不会将它用于任何类型的生产设置,但它肯定可以完成:

#include <iostream>
#include <tuple>
using namespace std;

template <int Index, typename... T>
class extractor {
    std::tuple<T const&...> values;
public:
    extractor(std::tuple<T const&...> values): values(values) {}
    template <typename A>
    extractor<Index + 1, T...> operator>> (A& arg) {
        arg = std::get<Index>(values);
        return extractor<Index + 1, T...>{ values };
    }
};

template <typename... T>
extractor<0, T...> make_extractor(T const&... values) {
    return extractor<0, T...>(std::tie(values...));
}

class example {
private:
    int my = 2;
    int my2 = 4;
    double my3 = 3.14;
public:
    template <typename A>
    extractor<0, int, double> operator>> (A& arg) {
        arg = my;
        return make_extractor(this->my2, this->my3);
    }
};

int main() {
    example abc;
    int s, t;
    double x;

    abc >> s >> t >> x;
    cout << s << " " << t << " " << x << "\n";
}