Здравствуйте, lseder, Вы писали:
L>Привет,
L> Что же такое мета-программирование ? Макросы для генерации кода ?
L>Можно ваше определение, для чего служит, как может выглядеть.
Программирование на этапе компиляции.
Разные языки программирования имеют разные для этого возможности.
К примеру, вот код на C++ для вычисления факториала:
#include <iostream>
template <int n>
struct factorial
{
enum
{
value = n * factorial<n - 1>::value
};
};
template <>
struct factorial<1>
{
enum
{
value = 1
};
};
int main()
{
std::cout << "Factorial of 10 is " << factorial<10>::value << std::endl;
return 0;
}
Factorial of 10 is 3628800
factorial<10>::value вычисляется на этапе компиляции, а не в рантайме.
Из наиболее очевидных применений — написание разнообразных статических проверок.
К примеру, есть следующий класс:
template <typename T_Type>
class foo
{
// ...
};
Допустим, по каким-то причинам нам понадобилось запретить использование foo<T_Type>,
когда T_Type является указателем.
Попробуем написать такую специализацию, которая при инстанциировании заставила бы
компилятор сгенерировать ошибочный код:
template <typename T_Type>
class foo<T_Type *>;
Вот и все ! Этот пустой тип будет "срабатывать" каждый раз, когда T_Type будет указателем.
foo<bool>, foo<int>, foo<some_class> или даже foo<foo<foo<some_class> > > являются допустимыми формами.
А вот при написании foo<int *> или foo<char *> получим ошибку на стадии компиляции.
Обычно такие классы-стражи именуются соответствующим образом (must_not_be_pointer, к примеру),
чтобы их легче было понять, увидев в списке ошибок.