2009-06-28 2 views
0

Мне любопытно узнать, если и когда мета-шаблоны C++ - хороший выбор дизайна для систем от малого до большого. Я понимаю, что они увеличивают время сборки, чтобы ускорить время выполнения. Тем не менее, я слышал, что код мета-шаблона изначально трудно понять многим разработчикам, что может быть проблемой для большой группы людей, работающих в системе с очень большой базой кода (миллионы строк кода). Где вы думаете, мета-шаблоны C++ полезны (или нет)?C++ Meta Templates: хороший или плохой выбор дизайна?

ответ

4

Metaprogramming - это еще один инструмент в инструментах для программистов (C++) - у него много отличных приложений, но, как что-либо, можно ошибочно или чрезмерно использовать. Я думаю, что у него плохая репутация с точки зрения «трудно использовать», и я думаю, что в основном это связано с тем, что это значительное дополнение к языку, и поэтому требуется время, чтобы учиться.

В качестве примера использования в реальном мире; Я использовал метапрограммирование шаблонов для реализации компиляций и библиотек прокладки в прошлом; внедрение этих без шаблонов было бы либо невозможным, либо требовало бы значительно большего количества кода, чем я должен был писать.

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

Если вы хотите увидеть некоторые хорошие примеры того, как она может быть использована, я предлагаю вам прочитать Modern C++ Design Андрея Alexandrescu (есть sample chapter на сайте издателя) - ИМО это одна из лучших книг по этой теме.

1

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

С другой стороны, некоторые виды использования шаблонов довольно легко понять и использовать. Например, общие контейнеры (векторные), интеллектуальные указатели, ...

+0

К сожалению, эти шаблоны полагаются на метапрограммирование, поэтому вы не можете получить один без другого. :) – jalf

4

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

Если его эффект был только, чтобы сделать код труднее читать, он не будет использоваться. Причина, по которой она время от времени используется, заключается в том, что она упрощает код в целом.

Конечно, программисты, не знакомые с метапрограммированием, не смогут прочитать или сохранить код, но разве это не аргумент против работы с программистами, которые не знают своих вещей?

Программисты, которые не знают о for-loop wil, считают, что это трудно читать.

2

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

0

Как всегда, вам нужно сбалансировать плюсы и минусы. Если ваша работа связана с производительностью (для метапрограммирования шаблонов также используются другие методы), вы должны сначала продемонстрировать, что есть значительные и важные преимущества в производительности, которые могут быть достигнуты с использованием методов метапрограммирования шаблонов.(Можно даже сделать программу, которая работает медленнее, препятствуя компилятору с чрезмерным использованием шаблонов, поэтому всегда измеряйте!)

C++ шаблоны не были изначально предназначены для метапрограммирования, поэтому даже относительно простые проблемы, решаемые с помощью метапрограммирования, могут создавать код что трудно понять, особенно людям, которые не знакомы с обычными методами метапрограммирования шаблонов (поскольку они обычно не очень интуитивны). Кроме того, в зависимости от конкретной проблемы вы можете рассмотреть возможность генерации кода и метапрограммирование шаблонов.

0

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

  • рукописных смарт-указатели для любых видов вещей ваше приложение использует
  • STL контейнеры
  • статической проверки

И только для продвинутых пользователей:

  • тр aits, используемые для некоторых очевидных стандартных приложений (привязки языка сценариев и сериализации).

Это, пожалуй, немного консервативно, но, похоже, легко убедить всех в ценности этих вещей. Если они хорошо сочетаются, они не раздувают время компиляции и в основном работают очень хорошо с общепринятыми возможностями просмотра кода. И большинство шаблонов не должны много объяснять, даже тому большому подмножеству программистов на С ++, которые не очень хорошо разбираются в шаблонах.

(Что касается повышения и любых других библиотек шаблонов, с которыми он еще не слился, кажется, что он довольно авантюрный по стандартам многих (большинства?) Программистов на С ++ на данный момент. Поэтому мне представляется разумным избегать это на данный момент.)

+0

Я должен не соглашаться с этим. В C++ нет ничего более предприимчивого, чем попытка изобретать колесо. Если у Boost есть необходимая функциональность, используйте его. Boost.Spirit в значительной степени метапрограммирует ради него, но большинство других Boost libs довольно разумны и гораздо лучше разработаны, чем большинство людей пишут сами. – jalf

Смежные вопросы