如何使用提取运算符从 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";
}
就像我们在 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";
}