Библиотека Стандарта C++: Как записать обертки для суда, cerr, cin и endl?

Мне не нравится using namespace std, но я также устал от необходимости ввести std:: перед каждым cout, cin, cerr и endl. Так, я думал о давании их короче новые имена как это:

// STLWrapper.h

#include <iostream>
#include <string>

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;

Это работает. Но, есть ли какие-либо проблемы в вышеупомянутом, которое я пропускаю? Существует ли лучший способ достигнуть того же?

16
задан MSalters 15 November 2011 в 16:13
поделиться

2 ответа

Почему бы и нет

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

и так далее на? Затем в своем коде вы можете использовать cin , cout и так далее, без случайного внедрения всего остального пространства имен std в ваш код.

59
ответ дан 30 November 2019 в 15:01
поделиться

Алекс дал вам ответ , как синтаксически решить эту проблему. Однако я хочу указать на два других аргумента относительно этой проблемы:

  1. Независимо от того, используете ли вы директиву using ( using namespace std ) или ее меньшую злобную сестру, a с использованием объявления ( с использованием std :: cout ), перегрузка может привести к неприятным сюрпризам. Набрать std :: не так уж и сложно, по сравнению с , потратив половину ночи на отладку , чтобы узнать , что ваш код называется std :: distance () вместо этого. вашей собственной функции distance () только потому, что вы допустили небольшую ошибку, и std :: distance () случайно подходит лучше.

  2. Строка кода записывается один раз , но - в зависимости от ее времени жизни - она читается десятки, сотни, а некоторые даже тысячи раз . Итак, время, необходимое для написания строки кода, просто не имеет значения , важно только время, необходимое для чтения и интерпретации строки кода . Даже если на написание строки со всеми правильными std :: уходит в три раза больше времени, если это ускоряет ее чтение всего на 10%, это все равно того стоит.
    Итак, важный вопрос: Легче ли читать и интерпретировать строку кода со всем std :: , или это сложнее ? Из другой ответ :

    Вот еще одна точка данных: много-много лет назад меня раздражало необходимость добавлять префикс всего из стандартной библиотеки с помощью std :: . Затем я работал в проекте, где с самого начала было решено, что как директивы using , так и объявления запрещены, за исключением областей видимости функций. Угадай, что? Большинству из нас потребовалось всего несколько недель, чтобы привыкнуть к написанию префикса, а еще через несколько недель большинство из нас даже согласились, что это на самом деле делает код более читабельным . (Для этого есть причина: Нравится ли вам более короткая или более длинная проза, это субъективно, но префиксы объективно добавляют ясности коду. Не только компилятор, но и вам также легче увидеть, какой идентификатор упоминается.)

    За десять лет этот проект вырос до нескольких миллионов строк кода. Поскольку эти обсуждения возникают снова и снова, мне однажды было любопытно, как часто (разрешенная) функция-область видимости с использованием фактически использовалась в проекте. Я поискал его в источниках и нашел только один или два десятка мест, где он использовался. Для меня это означает, что однажды попытался, разработчики не нашли std :: достаточно болезненным , чтобы использовать директивы using даже раз в 100kLoC , даже если это было разрешено. .

    Мне грустно, что в каждой книге и руководстве вы найдете пропуски std :: , потому что это заставляет людей привыкать читать код именно так. Когда я несколько лет преподавал C ++ (после вышеупомянутого опыта), я сказал своим студентам, что не хочу видеть в их коде директивы или объявления using . (Единственное исключение из этого правила - с использованием std :: swap , BTW, которое вам понадобится для того, чтобы swap (a, b) собирал перегрузки вне пространства имен std .) Как только они привыкли к этому, они не возражали и, когда их спросили об этом, они сказали, что находят код без префикса std :: запутанным. Некоторые даже добавляли префикс std :: в код, который они набирали из книги или учебника, в котором его не было .

Итог: Что такого сложного в вводе std :: , что все так взбесились? К настоящему времени я занимаюсь этим более 15 лет, и я вообще не пропускаю с использованием .

84
ответ дан 30 November 2019 в 15:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: