В C ++, SFINAE и метапрограммирование были преднамеренными или просто побочным продуктом шаблонов?


11

SFINAE и templateметапрограммирование могут делать замечательные вещи, и многие библиотеки также используют их значительно.

Исторически обе эти «магические концепции» были преднамеренно введены / поддержаны в C ++? Или они были позже обнаружены как полезные побочные продукты (побочные продукты) оригинального templateпрограммирования?

Ответы:


19

Около десяти лет назад, после дня конференции, я оказался в пабе с Эрвином Унру и несколькими другими, и я спросил его о программе, о которой упоминал VJovic . К тому времени у нас было несколько сортов пива, это была неофициальная встреча, и она прожила в моей голове в течение десятилетия, так что возьмите это с крошкой соли, но согласно моим воспоминаниям:

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

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

Я помню, что я специально спросил его о реакции Бьярна Страуструпа на программу, и в ответ Эрвин подражал ему, закрыв глаза рукой. :)

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


+1, интересный опыт. Они говорили что-нибудь о СФИНАЕ тогда?
iammilind

@iammilind: Я думаю, что SFINAE - только одна из упомянутых им функций, которые были добавлены для лучшей поддержки STL, хотя прозвище «SFINAE» появилось только спустя годы после этого.
ВОО

11

В 1994 году на заседании комитета по стандартизации c ++ Э. Унру обнаружил, что шаблоны могут использоваться для вычисления чего-либо во время компиляции. Он написал программу, которая печатает простые числа. Интригующей частью этого упражнения было то, что создание простых чисел выполнялось компилятором во время процесса компиляции, а не во время выполнения. Хотя эта программа не была полностью переносимой, она показала, что механизм создания шаблонов является примитивным рекурсивным языком, который может выполнять нетривиальные вычисления во время компиляции.

Этот отрывок взят из «шаблонов c ++» Вандевурда и Йосуттиса (глава 17).

Как вы можете видеть, он был обнаружен рано, и его сила была немедленно признана.


2
Неплохо. Такую статью я тоже читал в интернете, источник не помню. Это верно и для SFINAE?
Iammilind

@iammilind Что ты имеешь в виду под "Это тоже верно для СФИНА?"
BЈовић

1
SFINAE обычно нуждается в поддержке компилятора. Таким образом, возможно, что это, возможно, не было обнаружено случайно.
Iammilind

@iammilind Я нашел статью информатора, в которой есть аналогичный текст из книги: informit.com/articles/article.aspx?p=30667&seqNum=8
BЈовић

@iammilind Отредактировал ответ. Я бы сказал, что это случайно, поскольку поддержка шаблонов компиляторами была ограничена. Программа не была переносимой, и я думаю, что она работала только на одном компиляторе
BЈовић
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.