Причины не использовать макросы для уменьшения определения функции

0

Предположим, у меня есть класс

template
<
  typename ValType,
  typename SizeType        = size_t,
  typename ReservePolitics = double_size
>
class buffer {
public:

    buffer();
    buffer(dimension const& dim);

    // lots of functions ...

};

с функциями, определенными вне этого:

template
  <
    typename ValType,
    typename SizeType        = size_t,
    typename ReservePolitics = double_size
  >
buffer<ValType, SizeType, ReservePolitics>::
  buffer() : _Cap(), _Ptr(nullptr), _ResPol() {}

template
  <
    typename ValType,
    typename SizeType        = size_t,
    typename ReservePolitics = double_size
  >
buffer<ValType, SizeType, ReservePolitics>::
  buffer(dimension const& dim) :
    _Cap(), _Ptr(nullptr), _ResPol() { /*...*/ }

// lots of definitions ..

Эти определения трудно читать. Но я могу определить несколько макросов

#define BUFFHEADER\
  template\
  <\
    typename ValType,\
    typename SizeType      = size_t,\
    typename ReservePolitics = double_size>\
  >

#define BUFFINSTANCE buffer<ValType, SizeType, ReservePolitics>

#define BUFFNAMESPACE BUFFINSTANCE::

что помогает мне уменьшить эти определения:

BUFFHEADER BUFFNAMESPACE
  buffer() : _Cap(), _Ptr(nullptr), _ResPol() {}

BUFFHEADER BUFFNAMESPACE
  buffer(dimension const& dim) :
    _Cap(), _Ptr(nullptr), _ResPol() { /* ... */ }

Есть ли причины не делать этого и вводить объявление отверстия с template<... каждый раз?

  • 2
    не уверен, что это допустимо повторять значения параметров шаблона по умолчанию в каждом определении, но в любом случае не делайте этого
  • 3
    Вам нужно определить методы в заголовочном файле, иначе вы получите ошибки компоновщика. Так что просто сделайте это в определении класса, и у вас нет этой проблемы. Почему вы определяете методы вне класса?
Показать ещё 9 комментариев
Теги:
templates
macros

2 ответа

3
Лучший ответ

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

Хорошо, код более краткий и, вероятно, легче читать для вас. Тем не менее, это будет запутать для всех, кто прочитает ваш код. Даже если вы не хотите показывать какой-либо код, вы не должны использовать макросы. Вы узнаете, как читать код шаблона, если вы даете себе некоторое время. Макросы только мешают вам в этом.

Лучший способ сделать код более понятным - это изменить стиль разрывов строк. Если вы устраните хотя бы несколько строк, код будет более понятным, потому что вы сможете увидеть больше кода одновременно. Для каждой скобки вам не нужна новая строка.

Более того, макросы причудливы. Как правило, вы не должны использовать их. @Adrian Maire написал больше об этом в сообщении выше.

  • 0
    Я думаю, что кто-то не перепутал бы слишком совпадение, если бы он прочитал заголовочный файл с использованием макросов, определенных и определенных только в этом заголовке. Когда большие шаблоны пишутся короче, они выглядят ужасно.
  • 2
    @wowofbob Я знаю по своему опыту, что почти никто не читает весь файл. Обычно просто читайте определения одной функции. Конечно, каждый может найти макрос. Их не сложно понять, но это не главное. Просто проще читать знакомую структуру кода. Не нужно даже удивляться, если их смысл. Кроме того, есть еще аргумент, что вы должны научиться читать макрос.
Показать ещё 2 комментария
2

Макросы - мощный инструмент, но он может нести к ужасно неясному (трудно понять и отлаживать) код.

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

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

Макросы помогают сделать код короче, но это обычно не означает, что его легче читать и компилировать. Короче! = Лучше

Вот почему макросы являются одним из таких методов, как goto/labels, break/continue, return abuse и т.д., Которые программисты имеют тенденцию запрещать.

Макросы могут по-прежнему быть полезными для некоторых очень специфических целей, но их следует избегать, если нет веских оснований для их использования. Это должно ответить на ваш вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню