Стандартная библиотека 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 пространство имен в ваш код.

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

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

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

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

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

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

Итог: что такого сложного в наборе текста std:: что все так взволнованы? Я занимаюсь этим уже более 15 лет и не скучаю using совсем.

Другие вопросы по тегам