Мне не нравится 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;
Это работает. Но, есть ли какие-либо проблемы в вышеупомянутом, которое я пропускаю? Существует ли лучший способ достигнуть того же?
Почему бы и нет
using std::cin;
using std::cout;
и так далее на? Затем в своем коде вы можете использовать cin
, cout
и так далее, без случайного внедрения всего остального пространства имен std
в ваш код.
Алекс дал вам ответ , как синтаксически решить эту проблему. Однако я хочу указать на два других аргумента относительно этой проблемы:
Независимо от того, используете ли вы директиву using ( using namespace std
) или ее меньшую злобную сестру, a с использованием объявления ( с использованием std :: cout
), перегрузка может привести к неприятным сюрпризам. Набрать std ::
не так уж и сложно, по сравнению с , потратив половину ночи на отладку , чтобы узнать , что ваш код называется std :: distance ()
вместо этого. вашей собственной функции distance ()
только потому, что вы допустили небольшую ошибку, и std :: distance ()
случайно подходит лучше.
Строка кода записывается один раз , но - в зависимости от ее времени жизни - она читается десятки, сотни, а некоторые даже тысячи раз . Итак, время, необходимое для написания строки кода, просто не имеет значения , важно только время, необходимое для чтения и интерпретации строки кода . Даже если на написание строки со всеми правильными std ::
уходит в три раза больше времени, если это ускоряет ее чтение всего на 10%, это все равно того стоит.
Итак, важный вопрос: Легче ли читать и интерпретировать строку кода со всем std ::
, или это сложнее ? Из другой ответ :
Вот еще одна точка данных: много-много лет назад меня раздражало необходимость добавлять префикс всего из стандартной библиотеки с помощью
std ::
. Затем я работал в проекте, где с самого начала было решено, что как директивыusing
, так и объявления запрещены, за исключением областей видимости функций. Угадай, что? Большинству из нас потребовалось всего несколько недель, чтобы привыкнуть к написанию префикса, а еще через несколько недель большинство из нас даже согласились, что это на самом деле делает код более читабельным . (Для этого есть причина: Нравится ли вам более короткая или более длинная проза, это субъективно, но префиксы объективно добавляют ясности коду. Не только компилятор, но и вам также легче увидеть, какой идентификатор упоминается.)За десять лет этот проект вырос до нескольких миллионов строк кода. Поскольку эти обсуждения возникают снова и снова, мне однажды было любопытно, как часто (разрешенная) функция-область видимости
с использованием
фактически использовалась в проекте. Я поискал его в источниках и нашел только один или два десятка мест, где он использовался. Для меня это означает, что однажды попытался, разработчики не нашлиstd ::
достаточно болезненным , чтобы использовать директивы using даже раз в 100kLoC , даже если это было разрешено. .
Мне грустно, что в каждой книге и руководстве вы найдете пропуски std ::
, потому что это заставляет людей привыкать читать код именно так. Когда я несколько лет преподавал C ++ (после вышеупомянутого опыта), я сказал своим студентам, что не хочу видеть в их коде директивы или объявления using
. (Единственное исключение из этого правила - с использованием std :: swap
, BTW, которое вам понадобится для того, чтобы swap (a, b)
собирал перегрузки вне пространства имен std
.) Как только они привыкли к этому, они не возражали и, когда их спросили об этом, они сказали, что находят код без префикса std ::
запутанным. Некоторые даже добавляли префикс std ::
в код, который они набирали из книги или учебника, в котором его не было .
Итог: Что такого сложного в вводе std ::
, что все так взбесились? К настоящему времени я занимаюсь этим более 15 лет, и я вообще не пропускаю с использованием
.