C ++ Standard Library: Como escrever invólucros para cout, cerr, cin e endl?

Eu não gosto de using namespace std , mas também estou cansado de ter que digitar std:: na frente de cada cout , cin , cerr e endl . Então, pensei em dar-lhes novos nomes mais curtos como este:

 // STLWrapper.h #include  #include  extern std::ostream& Cout; extern std::ostream& Cerr; extern std::istream& Cin; extern std::string& Endl; // STLWrapper.cpp #include "STLWrapper.h" std::ostream& Cout = std::cout; std::ostream& Cerr = std::cerr; std::istream& Cerr = std::cin; std::string _EndlStr("\n"); std::string& Endl = _EndlStr; 

Isso funciona. Mas, há algum problema no acima que estou faltando? Existe uma maneira melhor de conseguir o mesmo?

Por que não

 using std::cin; using std::cout; 

e assim por diante? Em seguida, em seu código, você pode usar cin , cout e assim por diante, sem injetar acidentalmente todo o resto do namespace std em seu código.

Alex deu-lhe uma resposta como sintaticamente resolver esse problema. No entanto, quero apontar dois outros argumentos sobre esse problema:

  1. Não importa se você está empregando uma diretiva using ( using namespace std ) ou sua irmã evil less, uma declaração using std::cout ( using std::cout ), a sobrecarga pode levar a surpresas desagradáveis. Não é muito trabalhoso digitar std:: comparado a gastar meio-dia de debugging para descobrir seu código chamado std::distance() invés de sua própria function distance() , só porque você cometeu um pequeno erro e std::distance() acidentalmente é um jogo melhor.

  2. Uma linha de código é escrita uma vez , mas – dependendo de sua vida útil – é lida como dezenas, centenas e até mesmo milhares de vezes . Portanto, o tempo necessário para escrever uma linha de código simplesmente não importa , o importante é o tempo necessário para ler e interpretar uma linha de código . Mesmo que demore três vezes mais tempo para escrever uma linha com todo o std:: in adequado, se a leitura for apenas 10% mais rápida, ainda vale a pena.
    Portanto, a questão importante é: é mais fácil ler e interpretar uma linha de código com todo o std:: in ou é mais difícil ? De outra resposta :

    Aqui está mais um ponto de dados: Muitos, muitos anos atrás, eu também achei irritante ter que prefixar tudo da biblioteca padrão com std:: . Então, trabalhei em um projeto no qual foi decidido, no começo, que tanto as diretivas quanto as declarações eram proibidas, exceto para escopos de function. Adivinha? A maioria de nós demorou muito poucas semanas para se acostumar a escrever o prefixo e depois de mais algumas semanas a maioria de nós chegou a concordar que isso realmente tornava o código mais legível . (Há uma razão para isso: se você gosta de prosa mais curta ou mais longa é subjetivo, mas os prefixos adicionam objetivamente clareza ao código. Não apenas o compilador, mas você também acha mais fácil ver a qual identificador é referido.)

    Em uma década, esse projeto cresceu para ter vários milhões de linhas de código. Uma vez que essas discussões surgiram de novo e de novo, certa vez fiquei curioso com a frequência com que o using escopo da function (permitido) era realmente usado no projeto. Eu grep’d as fonts para isso e só encontrei uma ou duas dúzias de lugares onde foi usado. Para mim, isso indica que, uma vez tentados, os desenvolvedores não achavam difícil o bastante empregar diretivas usando uma vez a cada 100kLoC, mesmo quando era permitido usá- las .

    Eu acho triste que todos os livros e tutoriais venham a encontrar pulos std:: , porque isso faz as pessoas se acostumarem a ler o código dessa maneira. Quando eu ensinei C ++ por vários anos (após a experiência acima mencionada), eu disse aos meus alunos que eu não quero ver nenhuma diretiva using ou declaração em seu código. (A única exceção a essa regra é using std::swap , BTW, que você precisará para ter swap(a,b) pick up sobrecarrega fora do namespace std .) Uma vez que eles se acostumaram com isso, eles não fizeram isso. Lembre-se e, quando perguntado sobre isso, eles disseram que encontraram código sem o std:: prefix confuso. Alguns até adicionaram o prefixo std:: ao código typescript de um livro ou tutorial que não o tinha .

Resumindo: O que é tão difícil de digitar std:: que todo mundo fica tão empolgado com isso? Até agora, faço isso há mais de 15 anos e não sinto falta de using -lo.