Как использовать оператор извлечения, чтобы получить несколько значений из метода класса в C ++?

Как мы используем в Cin:

cin >> a >> b;

получить несколько значений из входного потока и вставить их в несколько переменных.
Как мы можем реализовать этот метод в нашем собственном классе? Чтобы получить несколько значений из него.
Я пробовал это как нашел Вот:

#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;
}

Но получаю ошибку «нет совпадения для оператора >> (типы операндов:« пример »и« int »)»

PS: я знаю альтернативные способы, но я хочу знать этот конкретный способ сделать это, спасибо.

0

Решение

Определенный вами оператор вставки работает с std::istream как источник, а не ваш собственный класс. Хотя я думаю, что ваша цель опрометчива, вы можете создать аналогичные операторы для своего класса. Вам понадобится некоторая сущность с подходящим состоянием, так как операторы в цепочке должны извлекать разные значения.

Я бы не стал использовать это для любого вида производства, но это, безусловно, можно сделать:

#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";
}
0

Другие решения

Вы хотите извлечь данные из example в int, Вместо этого вы написали код для извлечения данных из istream в example, Вот почему правильная функция не может быть найдена: вы ее не написали.

Если вы действительно хотите разрешить abc >> s >> t работать, вы должны будете определить operator>>(example&, int&) и добавьте семантику потока / курсора в ваш класс, чтобы отслеживать на каждом шаге то, что было извлечено до сих пор. Это действительно похоже на больше проблем, чем оно того стоит.

1

По вопросам рекламы [email protected]