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