c ++: хорошее имя для классов преобразования аргументов - PullRequest
2 голосов
/ 09 января 2011

В C ++ я иногда получаю служебные классы, подобные этим:

struct time_ref
{
   time_ref(FILETIME & ft) : ftval(&ft), ttval(0) {}
   time_ref(time_t & tt) : ttval(&tt), ftval(0) {}

   FILETIME * ftval; 
   time_t   * ttval;
}

Они полагаются на импровизированные преобразования, например, чтобы уменьшить количество перегрузок:

void Foo(int x, int y, time_ref t)

Обоснование: еслиУ Foo есть другой параметр с перегрузками, умножение прототипов, например, 3 перегрузки для X * 2 перегрузки для t - это 6 прототипов, по сравнению с 3 с вышеуказанным преобразователем (или даже один, если используются два преобразователя).


Они всегда:

  • имеют неявные конструкторы для двух типов или типов mroe
  • должны использоваться только в качестве параметров функции для включения этих преобразований

Thyeотличаются:

  • Количество поддерживаемых типов
  • может хранить значение или ссылку
  • на то, как вызываемый объект определяет, какой тип был предоставлен (в приведенном выше случае,это ненулевой указатель. Другой типичной реализацией является поле enum и объединение значений данных)

Вопросы:

1.Существует ли общепринятое / общепринятое имя для этого шаблона? Я обычно называю их «преобразователь аргументов» или «адаптер аргументов», что не кажется распространенным

2.любые рекомендации по их формализации - например, есть ли способ (помимо добавления комментария, говорящего так), чтобы гарантировать, что они используются только в качестве параметров?Любые другие вещи, которые нужно знать?

Ответы [ 3 ]

1 голос
/ 09 января 2011

Подкладка часто является хорошим выбором, когда вам нужно обрабатывать много разных типов аргументов, даже после того, как ваш интерфейс "готов".Это позволяет выполнять преобразование модульным, достаточно многократно используемым способом.См. эту статью в Википедии и статьи, на которые она ссылается, для получения дополнительной информации.

1 голос
/ 09 января 2011
  1. Как вы, наверное, знаете, в C ++ «принятый / общий» зависит от платформы, на которой вы работаете.Например, программа Unix C ++ откладывает соглашения от программы WIN32 C ++.Тем не менее, я не видел таких классов очень часто по очевидным причинам: они влекут за собой снижение производительности.Вы создаете новый объект при каждом вызове функции, что довольно ненужно.Тем не менее, это экономит вам некоторый код, поэтому в определенных случаях может стоить того, но все же его следует тщательно рассмотреть.

  2. Насколько я знаю, в C ++ нет путичтобы ограничить класс t, будет использоваться только в качестве параметра.По крайней мере, они не могут быть созданы без получения одного из поддерживаемых типов в своих конструкторах.Одна вещь, о которой я думаю, это то, что вам, вероятно, следует поддерживать ctor-копию, чтобы позволить передавать сам класс конвертера между вызовами (если у вас есть два отдельных набора функций, как вы описали, и один вызывает другой).

0 голосов
/ 09 января 2011

Что не так с перегрузками? Совершенно безопасно определить Foo (X), который реализован с использованием Foo (Bar (X)). Я думаю, что классы для создания предметов-обёрток понятнее.

...