Есть ли что-то плохое в выполнении подобных вещей, чтобы защитить код от слишком большого числа 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.

c++
2
user3586940 2 Май 2019 в 12:26

3 ответа

Лучший ответ

Моя главная проблема с вашими именами заключается в том, что они приводят к непредвиденным ошибкам, когда вы пытаетесь использовать их в качестве имен переменных. Наличие локальной переменной с именем vec довольно стандартная вещь.

Обратите внимание, что такого рода проблемы обычно избегают просто благодаря соглашениям об именах: например, в большинстве баз кода C ++ типы начинаются с заглавных букв и являются CamelCased, тогда как локальные переменные начинаются со строчной буквы (это также как подсветка синтаксиса на Stackoverflow работает, кстати). Обычно не проблема, что имена std следуют другому соглашению , потому что они находятся в своем собственном пространстве имен. Вы не можете назвать переменную std::vector.

По сути, ваши предложенные псевдонимы порвут с этим и откроют вам все досадные проблемы и «нечитаемость», которые эти соглашения должны были устранить.

3
Max Langhof 2 Май 2019 в 10:02

Делая это:

  1. Делает ваш код сложнее для чтения.

  2. Загрязняет пространство имен (возможно, глобальное) с vec и u_m.

C ++ достаточно лаконичен. Мое предложение было бы привыкнуть к std::.

Нет ничего плохого в том, что using или typedef находятся в пределах class. Это может быть даже полезно; позволяет вам изменять компоненты определения без необходимости изменения зависимого кода.

5
Bathsheba 2 Май 2019 в 09:41

CppCoreGuidlines, написанные Бьярном Страуструпом и Хербом Саттером, содержат руководство по этому вопросу:
Используйте псевдонимы шаблонов, чтобы упростить нотацию и скрыть детали реализации.

Причина, приведенная ниже:

Улучшена читаемость. Реализация скрывается. Обратите внимание, что псевдонимы шаблонов заменяют многие свойства для вычисления типа. Они могут также использоваться, чтобы обернуть черту.

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

Тем не менее, вы также должны убедиться, что такие псевдонимы не являются избыточными, поскольку это может повлиять на производительность в соответствии с другими руководство.

3
P.W 2 Май 2019 в 09:50