2008-09-21 16 views
104

Statyczne metaprogramowanie (zwane również "metaprogramowaniem szablonu") jest świetną techniką C++, która pozwala na wykonywanie programów podczas kompilacji. Żarówka poszedł w mojej głowie tak szybko, jak czytam ten kanoniczny przykład METAPROGRAMOWANIE:Najlepsze wprowadzenie do metaprogramowania szablonów C++?

#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 C++ statyczne metaprogramowanie, jakie są najlepsze źródła (książki, strony internetowe, szkoleniowych on-line , cokolwiek)?

+40

żarówka "wyłączyła się" lub "włączono"? – horseyguy

+32

Wyłącz. Zdecydowanie wyłączony. –

Odpowiedz

99

[Odpowiadając na moje własne pytanie]

Najlepsze wprowadzeń znalazłem do tej pory są w rozdziale 10, „Static METAPROGRAMOWANIE w C++” od generatywnej programowania, metody, narzędzia i aplikacje Krzysztofa Czarneckiego i Ulrich W. Eisenecker, ISBN-13: 9780201309775; i rozdział 17, "Metaprograms" z C++ szablony: The Complete Guide David Vandevoorder i Nicolai M. Josuttis, ISBN-13: 9780201734843.

alt text http://ak.buy.com/db_assets/prod_images/941/30676941.jpgalt text http://ak.buy.com/db_assets/prod_images/235/31025235.jpgalt text http://ak.buy.com/db_assets/prod_images/704/30680704.jpgalt text http://ak.buy.com/db_assets/prod_images/218/39856218.jpg

Todd Veldhuizen ma doskonałą samouczek here .

Dobrym źródłem informacji dla C++ programowania w ogóle jest Nowoczesne C++ Projektowanie Andrei Alexandrescu, ISBN-13: 9780201704310. Książka ta łączy trochę metaprogramowanie z innymi technikami szablonów. W szczególności do metaprogramowania, patrz sekcje 2.1 "Asercje kompilacji", 2.4 "Mapowanie całek stałych do typów", 2.6 "Wybór typu", 2.7 "Wykrywanie konwersji i dziedziczenia w czasie kompilacji", 2.9 "NullType i EmptyType" i 2.10 " Wpisz cechy ".

Najlepszym źródłem pośredni/zaawansowany Znalazłem to C++ Template METAPROGRAMOWANIE David Abrahams i Aleksey Gurtovoy, ISBN-13: 9780321227256

Jeśli wolisz tylko jedna książka, uzyskać C++ Szablony: Kompletny przewodnik, ponieważ jest to również ogólne odniesienie dla szablonów.

+2

Link do utworu Todda Veldhuizena stał się nieaktualny. –

+1

Wierzę, że to: http://www10.informatik.uni-erlangen.de/~pflaum/pflaum/ProSeminar/meta-art.html – 0fnt

+1

link naprawiony teraz, dzięki! – jwfearn

3

google Alexandrescu, nowoczesny projekt C++: Generic programowania i projektowania Wzory Stosowane

4

Modern C++ jest jednym z najlepszych wprowadzeń czytałem. Obejmuje rzeczywiste użyteczne przykłady metaprogramowania szablonu. Zobacz także bibliotekę towarzyszącą Loki.

22

Książka Andrei Alexandrescu zawiera Modern C++ Design zawiera wiele tych i innych sztuczek dla szybkiego i wydajnego nowoczesnego kodu C++ i jest podstawą biblioteki Loki.

Warto również wspomnieć o bibliotekach Boost, które w dużym stopniu wykorzystują te techniki i są zazwyczaj bardzo wysokiej jakości, z czego można się uczyć (choć niektóre są dość gęste).

4

Oryginalne dokumenty Veldhuizen były dobre. Jeśli masz ochotę na całą książkę, znajdziesz tam książkę Vandevoorde "C++ Templates Complete Guide". A kiedy będziesz gotowy na kurs mistrzowski, wypróbuj Modern C++ Design firmy Alexandrescu.

11

Modern C++ Design, doskonała książka i wzór wzorcowy autorstwa Alexandrescu. Słowo ostrzeżenia, po przeczytaniu tej książki przestałem robić C++ i pomyślałem: "Co do cholery, mogę wybrać lepszy język i zdobyć go za darmo".

+4

"Co do cholery, mogę wybrać lepszy język i otrzymać go za darmo" Ummm, co masz na myśli? Jestem szczególnie zdezorientowany przez "za darmo". I jakie inne języki miałeś na myśli? –

+11

Metaprogramowanie szablonów C++ udostępnia wszystkie rodzaje nowych możliwości, takich jak przekazywanie typów lub lista typów jako argumentów itp. Większość tych funkcji jest dostępna w dynamicznie typowanych językach, takich jak python, o ładniejszej składni. –

+1

Jeśli szukasz języka, w którym możesz szybko napisać poprawne programy, Python jest lepszy niż C++. Jeśli potrzebujesz innych rzeczy, które zapewnia C++, dodanie możliwości języka Lisp do C++ może być lepsze niż próba C++ - w innym języku. –

6

dwóch dobrych książek, które przychodzi na myśl to:

  • Nowoczesne C++ Design/Andrei Alexandrescu (Jest to rzeczywiście 7 lat mimo nazwy!)
  • C++ Szablony: The Complete Guide/Vandevoorde & Josuttis

To dość głęboka dziedzina, więc dobra książka, taka jak ta, zdecydowanie polecana jest na stronach internetowych. Niektóre z bardziej zaawansowanych technik sprawią, że będziesz przez jakiś czas studiować kod, aby dowiedzieć się, jak działają!

5

Nie będzie dużej listy książek, ponieważ lista osób z dużym doświadczeniem jest ograniczona. Metaprogramowanie szablonów rozpoczęło się na dobre w czasie pierwszego warsztatu programowania szablonów C++ w 2000 r., A wielu z wymienionych autorów do tej pory uczestniczyło. (IIRC, Andrei nie.) Ci pionierzy wywarli wielki wpływ na to pole, i zasadniczo to, co powinno być napisane, jest teraz napisane. Osobiście radziłbym Vandevoordeowi & Josuttis. Alexandrescu to twarda książka, jeśli dopiero zaczynasz pracę.