Есть ли что-то плохое в выполнении подобных вещей, чтобы защитить код от слишком большого числа std ::?
// These underscore_cased type aliases make my code shorter and easier to read for me.
// For Example:
template<class T> using v=std::vector<T>;
template<class T, class U> using u_m=std::unordered_map<T,U>;
template<class T> using p_q=std::priority_queue<T>;
template<class T,class U> using u_mm=unordered_multimap<T,U>;
Или это рискованное поведение?
Я не вижу, как это загрязнит мое пространство имен, как использование пространства имен std.
3 ответа
Моя главная проблема с вашими именами заключается в том, что они приводят к непредвиденным ошибкам, когда вы пытаетесь использовать их в качестве имен переменных. Наличие локальной переменной с именем vec
довольно стандартная вещь.
Обратите внимание, что такого рода проблемы обычно избегают просто благодаря соглашениям об именах: например, в большинстве баз кода C ++ типы начинаются с заглавных букв и являются CamelCased
, тогда как локальные переменные начинаются со строчной буквы (это также как подсветка синтаксиса на Stackoverflow работает, кстати). Обычно не проблема, что имена std
следуют другому соглашению , потому что они находятся в своем собственном пространстве имен. Вы не можете назвать переменную std::vector
.
По сути, ваши предложенные псевдонимы порвут с этим и откроют вам все досадные проблемы и «нечитаемость», которые эти соглашения должны были устранить.
Делая это:
Делает ваш код сложнее для чтения.
Загрязняет пространство имен (возможно, глобальное) с
vec
иu_m
.
C ++ достаточно лаконичен. Мое предложение было бы привыкнуть к std::
.
Нет ничего плохого в том, что using
или typedef
находятся в пределах class
. Это может быть даже полезно; позволяет вам изменять компоненты определения без необходимости изменения зависимого кода.
CppCoreGuidlines, написанные Бьярном Страуструпом и Хербом Саттером, содержат руководство по этому вопросу:
Используйте псевдонимы шаблонов, чтобы упростить нотацию и скрыть детали реализации.
Причина, приведенная ниже:
Улучшена читаемость. Реализация скрывается. Обратите внимание, что псевдонимы шаблонов заменяют многие свойства для вычисления типа. Они могут также использоваться, чтобы обернуть черту.
Обратите внимание, что примеры, приведенные в этом руководстве, не находятся в глобальном пространстве имен.
Тем не менее, вы также должны убедиться, что такие псевдонимы не являются избыточными, поскольку это может повлиять на производительность в соответствии с другими руководство.
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .