У меня есть набор служебных функций, которые читают строки из потока, а не читают слово за словом. Они работают с string
с, поэтому я хотел бы локально изменить string
оператор извлечения только в рамках этих функций. Это возможно?
Что я делаю сейчас, чтобы создать struct
это string
и написание оператора извлечения только для этой структуры.
struct line{
string str;
};
istream& operator>>(istream& lhs, line& rhs){
return getline(lhs, rhs.str);
}
А потом извлекать istream
как это:
vector<line> foo{ istream_iterator<line>(istringstream("Lorem Ipsum\nLorem Ipsum")), istream_iterator<line>() };
Это прекрасно работает, но мне не нравится struct line
обертка. Я спрашиваю, могу ли я перегрузить локально istream& operator>>(istream& lhs, string& rhs)
чтобы сделать это вместо этого?
То, что вы просите, не возможно. Там уже существует istream& >>(istream&, string& )
так что вы не можете просто перезаписать это. Предоставление другого типа уже способ сделать это.
Одна вещь, которую вы могли бы сделать, это обеспечить преобразование из line
в std::string
так что ваш контейнер может быть просто std::vector<std::string>
вместо std::vector<line>
struct line{
string str;
operator string() const { return str; }
};
istringstream iss("Lorem Ipsum\nLorem Ipsum");
vector<string> foo{istream_iterator<line>(iss),
istream_iterator<line>() };
Таким образом, line
type не должен существовать вне процесса извлечения и попадать в остальную часть вашей кодовой базы.