Введите определение черт. Блобы черт и Метафункции

Лично, я прокрутил бы свое собственное. Можно использовать strtok, но необходимо заботиться с выполнением так (особенно при удалении начальных символов), что Вы знаете то, что память что.

Избавление от конечных пробелов легко, и довольно безопасно, поскольку можно просто вставить 0 поверх последнего пространства, рассчитав назад от конца. Избавление от продвижения пробелов означает перемещать вещи. Если Вы хотите сделать это на месте (вероятно, разумный), можно просто продолжать смещаться, все поддерживает один символ, пока нет никакого ведущего пространства. Или, чтобы быть более эффективными, Вы могли найти индекс первого непробела и сместить все назад на то число. Или, Вы могли просто использовать указатель на первый непробел (но тогда необходимо быть осторожными таким же образом, как Вы делаете с strtok).

7
задан fnieto - Fernando Nieto 12 December 2009 в 11:06
поделиться

2 ответа

Наличие одного шаблонного класса теперь называется «чертой blob». Не рекомендуется использовать "Traits blob", поскольку они плохо работают с метафункциями (т.е. функциями времени компиляции).

Мета-функция - это шаблон, который принимает класс и выполняет над ним некоторую операцию. Что-то вроде:

template <class T>
class metafunction
{
    typename T::type value = ...;
}

Затем вы можете вызвать мета-функцию для любой из ваших черт, выполнив:

metafunction<topic_type_support<int> >::value;
metafunction<topic_data_writer<int> >::value;

Вы не сможете вызвать мета-функцию с вашим классом blob черт, потому что теперь есть способ указать метафункции, которая typedef для использования.

Если вы хотите узнать больше о мета-функциях, я рекомендую книгу C ++ Template Metaprogramming .

5
ответ дан 7 December 2019 в 10:03
поделиться

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

Если если вы хотите углубиться, я бы поставил под сомнение отсутствие значений по умолчанию:

namespace dds {
  template <typename Topic> struct topic_traits {
    typedef typename Topic::type_support type_support;
    typedef typename Topic::data_writer data_writer;
    typedef typename Topic::data_reader data_reader;
    typedef typename Topic::seq_type seq_type;
  };
}

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

EDIT : С большим классом черт, разделение вещей может использоваться для уменьшения количества требуемых экземпляров,

1
ответ дан 7 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: