Шаблоны C ++ Turing-завершены? - PullRequest
99 голосов
/ 10 октября 2008

Мне сказали, что система шаблонов в C ++ является Turing-полной во время компиляции. Это упоминается в этом посте , а также в википедии .

Можете ли вы привести нетривиальный пример вычисления, использующего это свойство?

Полезен ли этот факт на практике?

Ответы [ 15 ]

2 голосов
/ 10 октября 2008

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

2 голосов
/ 10 октября 2008

Это может быть полезно, если вы хотите вычислить константы во время компиляции, по крайней мере, в теории. Проверьте шаблон метапрограммирования .

1 голос
/ 10 октября 2008

Примером, который является достаточно полезным, является класс отношений. Есть несколько вариантов, плавающих вокруг. Поймать случай D == 0 довольно просто с частичными перегрузками. Реальные вычисления заключаются в вычислении GCD N и D и времени компиляции. Это важно, когда вы используете эти соотношения в вычислениях во время компиляции.

Пример. При расчете сантиметров (5) * километров (5) во время компиляции вы умножаете коэффициент <1,100> и коэффициент <1000,1>. Для предотвращения переполнения требуется соотношение <10,1> вместо отношения <1000,100>.

1 голос
/ 10 октября 2008

A Машина Тьюринга завершена по Тьюрингу, но это не означает, что вы должны использовать ее для производственного кода.

Попытка сделать что-нибудь нетривиальное с шаблонами в моем опыте грязно, безобразно и бессмысленно. У вас нет возможности «отладить» свой «код», сообщения об ошибках во время компиляции будут загадочными и, как правило, в самых неожиданных местах, и вы можете добиться одинакового выигрыша в производительности разными способами. (Подсказка: 4! = 24). Хуже того, ваш код непонятен среднему программисту на C ++ и, вероятно, будет непереносимым из-за широкого диапазона уровней поддержки в современных компиляторах.

Шаблоны отлично подходят для генерации универсального кода (контейнерные классы, обертки классов, дополнения), но нет - на мой взгляд, полнота Тьюринга шаблонов НЕ ПОЛЕЗНА на практике

0 голосов
/ 22 октября 2009

Еще один пример того, как не программировать:

template<int Depth, int A, typename B>
struct K17 {
    static const int x =
    K17 <Depth+1, 0, K17<Depth,A,B> >::x
    + K17 <Depth+1, 1, K17<Depth,A,B> >::x
    + K17 <Depth+1, 2, K17<Depth,A,B> >::x
    + K17 <Depth+1, 3, K17<Depth,A,B> >::x
    + K17 <Depth+1, 4, K17<Depth,A,B> >::x;
};
template <int A, typename B>
struct K17 <16,A,B> { static const int x = 1; };
static const int z = K17 <0,0,int>::x;
void main(void) { }

Публикация на Шаблоны C ++ завершены

...