Getting std :: ifstream para lidar com LF, CR e CRLF?

Especificamente estou interessado emistream& getline ( istream& is, string& str );. Existe uma opção para o construtor ifstream dizer a ele para converter todas as codificações de nova linha em '\ n' sob o capô? Quero poder ligar paragetline e faça com que ele lide com todas as terminações de linh

Atualiza: Para esclarecer, quero poder escrever código que compila quase em qualquer lugar e receba informações de quase qualquer lugar. Incluindo os arquivos raros que possuem '\ r' sem '\ n'. Minimizando a inconveniência para qualquer usuário do software.

É fácil solucionar o problema, mas ainda estou curioso para saber como, no padrão, lidar com todos os formatos de arquivo de texto de maneira flexíve

getline lê em uma linha completa, até um '\ n', em uma string. O '\ n' é consumido no fluxo, mas o getline não o inclui na string. Tudo bem até agora, mas pode haver um '\ r' antes do '\ n' incluído na string.

Tem três tipos de terminações de linha visto em arquivos de texto: '\ n' é o final convencional em máquinas Unix, '\ r' foi (eu acho) usado em sistemas operacionais Mac antigos e o Windows usa um par '\ r' seguido por '\ n' .

O problema é quegetline deixa o '\ r' no final da strin

ifstream f("a_text_file_of_unknown_origin");
string line;
getline(f, line);
if(!f.fail()) { // a non-empty line was read
   // BUT, there might be an '\r' at the end now.
}

Edita Agradecimentos a Neil por apontar quef.good() não é o que eu queria.!f.fail() é o que eu quero.

Eu posso removê-lo manualmente (consulte a edição desta pergunta), o que é fácil para os arquivos de texto do Windows. Mas estou preocupado que alguém alimente um arquivo contendo apenas '\ r'. Nesse caso, presumo que o getline consumirá o arquivo inteiro, pensando que é uma única linha!

.. e isso nem sequer considera Unicode: -)

.. talvez o Boost tenha uma ótima maneira de consumir uma linha de cada vez a partir de qualquer tipo de arquivo de text

Edita Estou usando isso, para lidar com os arquivos do Windows, mas ainda sinto que não deveria! E isso não funcionará nos arquivos apenas '\ r'.

if(!line.empty() && *line.rbegin() == '\r') {
    line.erase( line.length()-1, 1);
}

questionAnswers(5)

yourAnswerToTheQuestion