Альтернативой является перегрузка >>, чтобы она работала непосредственно с вашей структурой:
struct Point {
int x;
int y;
friend std::istream& operator >>(std::istream& stream, Point& p) {
return stream >> p.x >> p.y;
}
}
Вы возвращаете поток, так что вы можете связать входы так же, как вы используете встроенные типы: cin >> p1 >> p2 >> p3
. В этом конкретном случае оператор может быть автономной функцией, а не другом, но в целом с другом легче работать.
В этом содержится много полезных подробностей о подобных вещах.