Как мы используем в 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: я знаю альтернативные способы, но я хочу знать этот конкретный способ сделать это, спасибо.
Определенный вами оператор вставки работает с 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";
}
Вы хотите извлечь данные из example
в int
, Вместо этого вы написали код для извлечения данных из istream
в example
, Вот почему правильная функция не может быть найдена: вы ее не написали.
Если вы действительно хотите разрешить abc >> s >> t
работать, вы должны будете определить operator>>(example&, int&)
и добавьте семантику потока / курсора в ваш класс, чтобы отслеживать на каждом шаге то, что было извлечено до сих пор. Это действительно похоже на больше проблем, чем оно того стоит.