Почему метапрограммирование важно?Разве скриптовая генерация кода не проще? - PullRequest
3 голосов
/ 22 ноября 2010

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

Ответы [ 4 ]

7 голосов
/ 22 ноября 2010

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

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

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

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

3 голосов
/ 22 ноября 2010

Из википедии:

Метапрограммирование - это написание компьютерных программ, которые пишут или манипулируют другими программами (или самими собой) в качестве своих данных [...]

ИтакГенерируемое скриптом генерирование кода - это метапрограммирование, если вы хотите расколоться.

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

2 голосов
/ 22 ноября 2010

Мое мнение?

Дело в метапрограммировании в том, что оно безопасно для типов.Макросы и автоматически сгенерированный код не знают языковых правил.

1 голос
/ 22 ноября 2010

действительно ли [метапрограммирование] предлагает что-либо, кроме генерации скриптового кода?

Взгляните на следующую мою метапрограмму. Он перегружает operator<< для любого массива T с, кроме случаев, когда T имеет тип char. (Без этой меры предосторожности вывод строковых литералов больше не будет работать.)

template <typename T, size_t n>
typename disable_if<
    is_same<typename remove_const<T>::type, char>::value,
    std::ostream&
>::type
operator<<(std::ostream& os, T (&array)[n])
{
    return print_range(os, array + 0, array + n);
}

Итак, как бы вы "написали сценарий" этой метапрограммы? Создать реальный код для каждого возможного типа T? Это неосуществимо, потому что вы не знаете во время «сценариев», какие типы будут существовать во время компиляции.

...