Кто-либо использует шаблонное метапрограммирование в реальной жизни? [закрытый]

31
задан Luc Touraille 30 August 2011 в 16:05
поделиться

14 ответов

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

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

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

27
ответ дан Eric 27 November 2019 в 21:28
поделиться

Многие программисты не используют, обрабатывает много по шаблону из-за плохой поддержки компилятора до недавнего времени. Однако, в то время как шаблоны имели много проблем в первенстве, более новые компиляторы имеют намного лучшую поддержку. Я пишу код, который должен работать с GCC на Mac и Linux, а также Microsoft Visual C++ и только с GCC 4 и VC ++ 2005 они, компилятор поддерживал стандарт действительно хорошо.

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

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

  • Интеллектуальные указатели (например, Считаемый на ссылку, копия на записи, и т.д.)
  • Математические классы поддержки, такие как Матрицы, векторы, шлицы, и т.д. который должен поддерживать множество типов данных и все еще быть эффективным.
-4
ответ дан Calliphony 27 November 2019 в 21:28
поделиться

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

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

-1
ответ дан 27 November 2019 в 21:28
поделиться

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

, Почему?

  1. Мы должны поддерживать 6 + платформы с собственный компонент платформа компиляторы. Достаточно трудно использовать STL в этой среде уже не говоря о современных шаблонных методах.
  2. Разработчики, кажется, не продолжают усовершенствования C++ больше. Мы используем C++, когда мы имеем к. У нас есть унаследованный код с проектами прежней версии. Новый код сделан в чем-то еще, например, Java, JavaScript, Flash.
2
ответ дан maccullt 27 November 2019 в 21:28
поделиться

Да я имею, главным образом чтобы сделать некоторые вещи, которые напоминают ввод утки, когда я обертывал API прежней версии в более современный интерфейс C++.

1
ответ дан Leon Timmermans 27 November 2019 в 21:28
поделиться

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

6
ответ дан user12310 27 November 2019 в 21:28
поделиться

Я использую шаблонное метапрограммирование все время, но в D, не C++. Шаблонный метаязык C++ был первоначально разработан для простой параметризации типа и стал полным по Тьюрингу метаязыком почти случайно. Это - поэтому Turing tarpit, что только Andrei Alexandrescu, не простые смертные, может использовать.

шаблонный подъязык D, с другой стороны, был на самом деле разработан для метапрограммирования вне простой параметризации типа. Andrei Alexandrescu , кажется, любит его, , но другие люди могут на самом деле понять его шаблоны D. Также достаточно мощно, что кто-то записал трассировщик лучей времени компиляции в нем как подтверждение концепции.

я предполагаю большую часть useful/non-trivial метапрограммы, которую я когда-либо писал в D, был шаблон функции, который, учитывая тип структуры как шаблонный параметр и список заголовка столбца называет в порядке, соответствующем объявлениям переменной в структуре как параметр периода выполнения, будет читать в файле CSV и возвращать массив структур, один для каждой строки, с каждым полем структуры, соответствующим столбцу. Все преобразования типов (строка для плавания, интервал, и т.д.) сделаны автоматически, на основе типов шаблонных полей.

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

7
ответ дан SCFrench 27 November 2019 в 21:28
поделиться

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

Для специализированного чтения, Todd Veldhuizen является знаменитостью в этой области. Популярная книга C++ и Объектно-ориентированное Числовое Вычисление для Ученых и Инженеров Daoqi Yang.

12
ответ дан Jared A Hicks 27 November 2019 в 21:28
поделиться

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

13
ответ дан 27 November 2019 в 21:28
поделиться

Я нашел политики, описанные в Modern C ++ Design, действительно полезными в двух ситуациях:

  1. Когда я разрабатываю компонент, который, как я ожидаю, будет использован повторно, но в немного по-другому. Предложение Александреску об использовании политики, отражающей дизайн, действительно хорошо вписывается в это - это помогает мне ответить на такие вопросы, как: «Я мог бы сделать это с помощью фонового потока, но что, если кто-то позже захочет сделать это в срезах времени?» Хорошо, я просто пишу свой класс, чтобы принять ConcurrencyPolicy и реализовать тот, который мне нужен в данный момент. Тогда, по крайней мере, я знаю, что человек, который приходит за мной, может написать и подключить новую политику, когда им это нужно, без необходимости полностью переделывать мой дизайн. Предостережение: я должен иногда управлять собой, или это может выйти из-под контроля - помните принцип ЯГНИ !

  2. Когда я пытаюсь преобразовать несколько похожих блоков кода в один. Обычно код копируется и слегка модифицируется, потому что в противном случае было бы слишком много логики if / else или потому, что используемые типы были слишком разными. Я обнаружил, что политики часто допускают чистую универсальную версию, где традиционная логика или множественное наследование не позволяют.

21
ответ дан 27 November 2019 в 21:28
поделиться

Спустя почти 8 месяцев после того, как я спросил об этом, я, наконец, использовал несколько TMP, я использую TypeList интерфейсов, чтобы реализовать QueryInterface в базовом классе.

2
ответ дан 27 November 2019 в 21:28
поделиться

Я использую его с boost :: statechart для больших машин состояний.

2
ответ дан 27 November 2019 в 21:28
поделиться

Я довольно часто использовал его с кодом DSP, особенно с БПФ, кольцевыми буферами фиксированного размера, преобразованиями Хадамара и т.п.

4
ответ дан 27 November 2019 в 21:28
поделиться

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

Тем не менее, я получил много преимуществ от метапрограммирования шаблонов при написании многократно используемых компонентов/библиотек. Я не говорю о чем-то большом, некоторые из вещей Boost просто маленькие компоненты, которые будут часто использоваться повторно.

Я использовал TMP для одноэлементной системы, где пользователь мог указать, какой тип одиночного элемента ему нужен. Интерфейс был очень простым. Под ним был установлен тяжелый ТМП.

template< typename T >
T& singleton();

template< typename T >
T& zombie_singleton();

template< typename T >
T& phoenix_singleton();

Другим успешным применением стало упрощение нашего уровня IPC. Он построен в классическом стиле ООП. Каждое сообщение должно происходить от абстрактного базового класса и переопределять некоторые методы сериализации. Ничего сверхъестественного, но генерируется много шаблонного кода.

Мы добавили немного TMP и автоматизировали генерацию всего кода для простого случая сообщений, содержащих только данные POD. Сообщения TMP по-прежнему используют объектно-ориентированный бэкенд, но они значительно сокращают объем шаблонного кода. TMP также использовался для создания средства просмотра сообщений. Со временем все наши сообщения перекочевали на метод TMP. Было проще и меньше кода создать простую структуру POD только для передачи сообщений и добавить несколько (возможно, 3) строк, необходимых для получения TMP для генерации классов, чем для получения нового сообщения для отправки обычного класса через IPC. рамки.

10
ответ дан 27 November 2019 в 21:28
поделиться
Другие вопросы по тегам:

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