У C ++ були SFINAE та метапрограмування навмисними чи просто побічний продукт шаблонів?


11

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

Історично обидва ці "магічні поняття" були навмисно введені / підтримувані в C ++? Або вони були пізніше виявлені як корисні побічні продукти (побічні продукти) оригінального templateпрограмування?

Відповіді:


19

Десь десять років тому після дня конференції я потрапив у паб з Ервіном Унрухом та ще кількома людьми, і я запитав його про програму, яку згадував Вйович . Тоді у нас було кілька пива, це була неофіційна зустріч, і це живе в моїй голові вже десятиліття, тож візьміть це з зерном солі, але за моїми спогадами:

Він сказав, що вони додали функції шаблону для кращого обслуговування STL. За його словами, деякі / багато членів комітету вважали, що вони щось створюють, не знаючи про всі його можливості. Він сам підозрював, що всі матеріали шаблону, особливо часткова спеціалізація, складають мову, повну Тюрінга, і він завжди мав намір зробити це формальним доказом цього, але ніколи цього не обійшов.

Натомість однієї ночі на зустрічі зі стандартизації він придумав ту програму, яка друкувала прості номери як повідомлення про помилки (версія, яка повинна працювати з сучасними компіляторами, є тут ), яку вона розраховувала під час компіляції. Як метапрограма шаблону, це не дуже вражає сучасні стандарти, але це було першим. Хтось зробив те, що він вважав жартом, офіційно подавши програму, щоб вона стала офіційним документом стандартизації ISO.

Пам’ятаю, що я спеціально розпитував його про реакцію Бьярне Струструпа на програму, і у відповідь Ервін наслідував його, прикривши очі рукою. :)

На жаль, я шкодую, що не запитав Тодда Велдхуйзена , який також був на тій конференції, як він придумав шаблони виразів . (Він, безумовно, був приємним хлопцем, з яким поговорити.) Але я був набагато молодший за це, і дозволю прожити можливість життя.:(


+1, цікавий досвід. Чи говорили вони щось про SFINAE тоді?
iammilind

@iammilind: Я думаю, що SFINAE - лише одна з особливостей, про які він згадав, які були додані для кращої підтримки STL, хоча монетар "SFINAE" був винайдений лише через роки після цього.
sbi

11

У 1994 р. Під час засідання комітету зі стандартизації c ++ Е. Унру виявив, що шаблони можна використовувати для обчислення чогось під час компіляції. Він написав програму, яка друкує прості числа. Інтригуючою частиною цієї вправи було те, що виробництво простих чисел здійснювалося компілятором під час процесу компіляції, а не під час виконання. Хоча ця програма була не повністю портативною, програма показала, що механізм інстанціалізації шаблонів є примітивною рекурсивною мовою, яка може виконувати нетривіальні обчислення під час компіляції.

Цей уривок узятий із "шаблонів c ++" Вандевурде та Йосуттіса (глава 17).

Як бачите, це було виявлено рано і його сила була визнана негайно.


2
Хороший. Таку статтю я читав і в Інтернеті, не пам’ятаю джерела. Це правда і для SFINAE?
iammilind

@iammilind Що ти маєш на увазі "Чи правда це і для SFINAE?"
BЈович

1
SFINAE зазвичай потребує певної підтримки компілятора. Тож можливо, що, можливо, його не виявили випадково.
iammilind

@iammilind я знайшов статтю давав InformIT, що має аналогічний текст з книги: informit.com/articles/article.aspx?p=30667&seqNum=8
BЈовіћ

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