1

У меня есть набор функций полезности, которые читаются в строках из потока, а не для чтения по слову. Они работают с string s, поэтому я бы хотел локально изменить оператор извлечения 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 обертку. Я спрашиваю, могу ли я локально перегрузить , чтобы выполнить это?

ответ

2

То, о чем вы просите, не представляется возможным. Там уже существует 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 типа не должен существовать вне добычи процесс и истекать кровью в остальную часть вашей кодовой базы.

+0

Спасибо за ответ, хотя это меня огорчает. Это на самом деле то, что я делал, я просто не хотел слишком много загромождать этот вопрос. –

Смежные вопросы