Мета-шаблоны C ++: хороший или плохой выбор дизайна? - PullRequest
0 голосов
/ 28 июня 2009

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

Ответы [ 6 ]

4 голосов
/ 28 июня 2009

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

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

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

Программистам, которые не знают о цикле for, тоже будет трудно читать.

4 голосов
/ 28 июня 2009

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

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

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

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

2 голосов
/ 28 июня 2009

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

1 голос
/ 28 июня 2009

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

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

0 голосов
/ 28 июня 2009

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

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

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

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

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

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

0 голосов
/ 28 июня 2009

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

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

...