Czy w C ++ SFINAE i metaprogramowanie były zamierzone, czy tylko produktem ubocznym szablonów?


11

SFINAE i templatemetaprogramowanie potrafią robić wspaniałe rzeczy, a wiele bibliotek również z nich korzysta.

Czy w przeszłości obie te „magiczne koncepcje” były celowo wprowadzane / obsługiwane w C ++? A może zostały później odkryte jako użyteczne produkty uboczne (produkty uboczne) oryginalnego templateprogramowania?

Odpowiedzi:


19

Około dekady temu po dniu konferencji znalazłem się w pubie z Erwinem Unruhem i kilkoma innymi osobami i zapytałem go o program, o którym wspominał VJovic . Mieliśmy już wtedy kilka piw, było to nieoficjalne spotkanie i żyło mi w głowie przez dekadę, więc weź to z odrobiną soli, ale zgodnie z moimi wspomnieniami:

Powiedział, że dodali funkcje szablonu, aby lepiej obsługiwać STL. Według niego, niektórzy / wielu członków komitetu uważało, że coś tworzą, nie znając jego pełnych możliwości. On sam podejrzewał, że wszystkie szablony, zwłaszcza tak częściowa specjalizacja, tworzyły kompletny język Turinga, i zawsze zamierzał to zrobić, ale nigdy tego nie robił.

Zamiast jednej nocy na spotkaniu normalizacji Wymyślił tego programu, który wydrukowany liczb pierwszych, jak komunikaty o błędach (w wersji, która powinna pracować z nowoczesnych kompilatorów jest tutaj ), że obliczane w czasie kompilacji. Jako szablonowy metaprogram nie jest imponujący jak na dzisiejsze standardy, ale mimo wszystko był pierwszy. Ktoś zrobił to, co uważał za żart, formalnie przedstawiając program, dzięki czemu stał się oficjalnym dokumentem normalizacyjnym ISO.

Pamiętam, że specjalnie zapytałem go o reakcję Bjarne Stroustrup na program, a w odpowiedzi Erwin naśladował go, zasłaniając oczy dłonią. :)

Z perspektywy czasu żałuję, że nie zapytałem Todda Veldhuizena , który również był na tej konferencji, jak wymyślił szablony ekspresji . (Z pewnością był miłym facetem do rozmowy.) Ale byłem o wiele młodszy i pozwoliłem, by szansa na życie minęła.:(


+1, ciekawe doświadczenie. Czy wtedy rozmawiali o SFINAE?
iammilind,

@iammilind: Myślę, że SFINAE to tylko jedna z wymienionych przez niego funkcji, które zostały dodane w celu lepszego wsparcia STL, chociaż pseudonim „SFINAE” powstał dopiero po latach.
sbi

11

W 1994 r. Podczas spotkania komitetu normalizacyjnego c ++ E. Unruh odkrył, że szablonów można użyć do obliczenia czegoś w czasie kompilacji. Napisał program, który drukuje liczby pierwsze. Intrygującą częścią tego ćwiczenia było to, że generowanie liczb pierwszych było wykonywane przez kompilator podczas procesu kompilacji, a nie w czasie wykonywania. Chociaż ten program nie był w pełni przenośny, program pokazał, że mechanizm tworzenia szablonów jest prymitywnym językiem rekurencyjnym, który może wykonywać nietrywialne obliczenia w czasie kompilacji.

Ten fragment pochodzi z „szablonów c ++” autorstwa Vandevoorde i Josuttis (rozdział 17).

Jak widać, został odkryty wcześnie, a jego moc rozpoznano natychmiast.


2
Dobry. Tego rodzaju artykuł przeczytałem również w Internecie, nie pamiętam źródła. Czy dotyczy to również SFINAE?
iammilind,

@iammilind Co masz na myśli mówiąc „Czy dotyczy to również SFINAE?”
BЈовић

1
SFINAE ogólnie potrzebuje wsparcia ze strony kompilatora. Możliwe więc, że nie zostało to przypadkowo odkryte.
iammilind,

@ iammilind Znalazłem artykuł informita, który ma podobny tekst z książki: informit.com/articles/article.aspx?p=30667&seqNum=8
15овић

@iammilind Edytował odpowiedź. Powiedziałbym, że to przypadek, ponieważ obsługa szablonów przez kompilatory była ograniczona. Program nie był przenośny i myślę, że działał tylko na jednym kompilatorze
BЈовић
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.