Najlepsze wprowadzenie do metaprogramowania szablonów w C ++? [Zamknięte]

112

Metaprogramowanie statyczne (inaczej „metaprogramowanie szablonów”) to doskonała technika C ++, która umożliwia wykonywanie programów w czasie kompilacji. Żarówka zgasła w mojej głowie, gdy tylko przeczytałem ten przykład kanonicznego metaprogramowania:

#include <iostream>
using namespace std;

template< int n >
struct factorial { enum { ret = factorial< n - 1 >::ret * n }; };

template<>
struct factorial< 0 > { enum { ret = 1 }; };

int main() {
    cout << "7! = " << factorial< 7 >::ret << endl; // 5040
    return 0;
}

Jeśli ktoś chce dowiedzieć się więcej o metaprogramowaniu statycznym w C ++, jakie są najlepsze źródła (książki, strony internetowe, kursy online, cokolwiek)?

jwfearn
źródło
43
żarówka zgasła lub włączyła się?
horseyguy
36
Poza. Zdecydowanie wyłączone.
Thomas Eding

Odpowiedzi:

108

[Odpowiadając na moje własne pytanie]

Najlepsze wprowadzenia, jakie do tej pory znalazłem, to rozdział 10, „Metaprogramowanie statyczne w C ++” z książki Generative Programming, Methods, Tools, and Applications autorstwa Krzysztofa Czarneckiego i Ulricha W. Eiseneckera, ISBN-13: 9780201309775; oraz rozdział 17, „Metaprogramy” C ++ Templates: The Complete Guide , David Vandevoorder i Nicolai M. Josuttis, ISBN-13: 9780201734843.

tekst alternatywny tekst alternatywny tekst alternatywny tekst alternatywny

Todd Veldhuizen ma tutaj doskonały poradnik .

Dobrym źródłem do programowania w C ++ w ogóle jest Modern C ++ Design autorstwa Andrei Alexandrescu, ISBN-13: 9780201704310. Ta książka łączy trochę metaprogramowania z innymi technikami szablonowymi. W szczególności dotyczące metaprogramowania, zobacz sekcje 2.1 „Asercje w czasie kompilacji”, 2.4 „Mapowanie stałych całkowych na typy”, 2.6 „Wybór typu”, 2.7 „Wykrywanie konwertowalności i dziedziczenia w czasie kompilacji”, 2.9 " NullTypei EmptyType" oraz 2.10 "Cechy typu ”.

Najlepszym źródłem dla średnio zaawansowanych / zaawansowanych, jakie znalazłem, jest C ++ Template Metaprogramming autorstwa Davida Abrahamsa i Alekseya Gurtovoya, ISBN-13: 9780321227256

Jeśli wolisz tylko jedną książkę, pobierz C ++ Templates: The Complete Guide, ponieważ jest to również ostateczne odniesienie do szablonów w ogóle.

jwfearn
źródło
2
Link do utworu Todda Veldhuizena zestarzał się.
John R. Strohm
1
link naprawiony teraz, dzięki!
jwfearn
Link jest znowu uszkodzony!
Paul
1
Dziękuję @jwfearn, przeczytałem ten artykuł, chociaż uważam, że jest bardziej interesujący: youtube.com/watch?v=Am2is2QCvxY (ma dwie części). To jest wykład Waltera E. Browna: Modern Template Metaprogramming: A Compendium
Paul
24

Książka Andrei Alexandrescu o nowoczesnym projekcie C ++ obejmuje wiele z tych i innych sztuczek dotyczących szybkiego i wydajnego nowoczesnego kodu C ++ i jest podstawą dla biblioteki Loki .

Warto również wspomnieć o bibliotekach Boost , które intensywnie korzystają z tych technik i są zwykle bardzo wysokiej jakości, z których można się uczyć (chociaż niektóre są dość gęste).

Alaric
źródło
12

Nowoczesny projekt C ++ , genialny framework do tworzenia książek i wzorców projektowych autorstwa Alexandrescu. Słowo ostrzeżenia, po przeczytaniu tej książki przestałem robić C ++ i pomyślałem "Co do cholery, mogę po prostu wybrać lepszy język i dostać go za darmo".

Florian Bösch
źródło
5
„Co do cholery, mogę po prostu wybrać lepszy język i dostać go za darmo” Ummm, co masz na myśli? Szczególnie zdezorientowane jest mnie słowo „za darmo”. A jaki inny język miałeś na myśli?
Pop Catalin,
12
Metaprogramowanie szablonów w C ++ daje ci wszelkiego rodzaju nowe możliwości, takie jak przekazywanie typów lub listy typów jako argumentów itp. Większość z tych możliwości jest obecna w językach dynamicznie typowanych, takich jak python, z ładniejszą składnią.
Florian Bösch,
1
Jeśli szukasz języka, w którym możesz szybko pisać poprawne programy, Python jest lepszy niż C ++. Jeśli potrzebujesz innych rzeczy, które zapewnia C ++, dodanie możliwości Lispa do C ++ może być lepsze niż próba C ++ - ify innego języka.
David Thornley
6

Dwie dobre książki, które przychodzą mi do głowy to:

  • Nowoczesny projekt C ++ / Andrei Alexandrescu (w rzeczywistości ma 7 lat pomimo nazwy!)
  • Szablony C ++: kompletny przewodnik / Vandevoorde & Josuttis

Jest to dość obszerna dziedzina, więc dobra książka, taka jak jedna z tych, jest zdecydowanie zalecana na stronach internetowych. Niektóre z bardziej zaawansowanych technik pozwolą ci przestudiować kod przez jakiś czas, aby dowiedzieć się, jak działają!

Nik
źródło
5

Nowoczesne C ++ to jedno z najlepszych wprowadzeń, jakie przeczytałem. Obejmuje rzeczywiste użyteczne przykłady metaprogramowania szablonów. Przyjrzyj się także towarzyszącej bibliotece Loki .

Zaćmienie
źródło
5

Nie będzie dużej listy książek, ponieważ lista osób z dużym doświadczeniem jest ograniczona. Metaprogramowanie szablonów zaczęło się naprawdę wokół pierwszych warsztatów programowania szablonów w języku C ++ w 2000 roku, w których uczestniczyło wielu autorów wymienionych do tej pory. (IIRC, Andrei nie.) Ci pionierzy wywarli wielki wpływ na tę dziedzinę i zasadniczo to, co powinno być napisane, jest teraz napisane. Osobiście radziłbym Vandevoorde i Josuttisowi. Alexandrescu to trudna książka, jeśli jesteś nowy w tej dziedzinie.

MSalters
źródło
4

Oryginalne dokumenty Veldhuizena były dobre. Jeśli masz ochotę na całą książkę, to jest książka Vandevoorde „Kompletny przewodnik po szablonach C ++”. A kiedy będziesz gotowy na kurs magisterski, wypróbuj Modern C ++ Design Alexandrescu.

opuchnięty
źródło
4

google Alexandrescu, nowoczesny projekt C ++: ogólne programowanie i stosowane wzorce projektowe

Maxim Ananyev
źródło