Melhor introdução à metaprogramação de template C ++? [fechadas]

112

A metaprogramação estática (também conhecida como "metaprogramação de modelo") é uma ótima técnica C ++ que permite a execução de programas em tempo de compilação. Uma lâmpada acendeu na minha cabeça assim que li este exemplo de metaprogramação canônica:

#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;
}

Se alguém quiser aprender mais sobre a metaprogramação estática C ++, quais são as melhores fontes (livros, sites, material didático on-line, qualquer coisa)?

jwfearn
fonte
43
a lâmpada "apagou" ou "ligou"?
horseyguy
36
Fora. Definitivamente desligado.
Thomas Eding

Respostas:

108

[Respondendo minha própria pergunta]

As melhores introduções que encontrei até agora são o capítulo 10, "Static Metaprogramming in C ++" de Generative Programming, Methods, Tools, and Applications de Krzysztof Czarnecki e Ulrich W. Eisenecker, ISBN-13: 9780201309775; e capítulo 17, "Metaprograms" of C ++ Templates: The Complete Guide de David Vandevoorder e Nicolai M. Josuttis, ISBN-13: 9780201734843.

texto alternativo texto alternativo texto alternativo texto alternativo

Todd Veldhuizen tem um excelente tutorial aqui .

Um bom recurso para programação C ++ em geral é Modern C ++ Design de Andrei Alexandrescu, ISBN-13: 9780201704310. Este livro mistura um pouco de metaprogramação com outras técnicas de modelo. Para metaprogramação em particular, consulte as seções 2.1 "Asserções de tempo de compilação", 2.4 "Mapeamento de constantes integrais para tipos", 2.6 "Seleção de tipo", 2.7 "Detecção de conversibilidade e herança em tempo de compilação", 2.9 " NullTypee EmptyType" e 2.10 "Traços de tipo "

O melhor recurso intermediário / avançado que encontrei é C ++ Template Metaprogramming de David Abrahams e Aleksey Gurtovoy, ISBN-13: 9780321227256

Se você preferir apenas um livro, obtenha Modelos C ++: o guia completo, pois também é a referência definitiva para modelos em geral.

jwfearn
fonte
2
O link para a peça de Todd Veldhuizen ficou obsoleto.
John R. Strohm
1
link corrigido agora, obrigado!
jwfearn de
O link está quebrado novamente!
Paul,
1
Obrigado @jwfearn, li o artigo, mas achei mais interessante: youtube.com/watch?v=Am2is2QCvxY (tem duas partes). É uma palestra de Walter E. Brown: Modern Template Metaprogramming: A Compendium
Paul,
24

O livro Modern C ++ Design de Andrei Alexandrescu cobre muitos desses e outros truques para código C ++ moderno, rápido e eficiente, e é a base para a biblioteca Loki .

Também vale a pena mencionar as bibliotecas Boost , que usam muito essas técnicas e geralmente são de muito alta qualidade para se aprender (embora algumas sejam bastante densas).

Alaric
fonte
12

Modern C ++ Design , um livro brilhante e estrutura de padrões de design de Alexandrescu. Um aviso, depois de ler este livro parei de fazer C ++ e pensei "Que diabos, posso simplesmente escolher uma linguagem melhor e obtê-la de graça".

Florian Bösch
fonte
5
"Que diabos, posso simplesmente escolher um idioma melhor e obtê-lo de graça" Ummm, o que você quer dizer? Estou especialmente confuso com "de graça". E que outro idioma você tinha em mente?
Pop Catalin de
12
A metaprogramação de template C ++ oferece todos os tipos de novos recursos, como passar tipos ou lista de tipos como argumentos, etc. A maioria desses recursos estão presentes em linguagens de tipo dinâmico como python, com sintaxe mais agradável.
Florian Bösch
1
Se você está procurando uma linguagem que possa escrever programas corretos rapidamente, Python é melhor do que C ++. Se você precisar de algumas das outras coisas que C ++ oferece, adicionar capacidade semelhante ao Lisp em C ++ pode ser melhor do que tentar C ++ - criar outra linguagem.
David Thornley
6

Dois bons livros que vêm à mente são:

  • Modern C ++ Design / Andrei Alexandrescu (na verdade tem 7 anos, apesar do nome!)
  • Modelos C ++: o guia completo / Vandevoorde & Josuttis

É um campo bastante aprofundado, então um bom livro como um desses é definitivamente recomendado para sites. Algumas das técnicas mais avançadas farão com que você estude o código por algum tempo para descobrir como eles funcionam!

Nik
fonte
5

C ++ moderno é uma das melhores introduções que já li. Ele cobre exemplos úteis reais de metaprogramação de template. Também dê uma olhada na biblioteca associada Loki .

Eclipse
fonte
5

Não haverá uma lista grande de livros, pois a lista de pessoas com muita experiência é limitada. A metaprogramação de template começou para valer em torno do primeiro C ++ Template Programming Workshop em 2000, e muitos dos autores citados até agora compareceram. (IIRC, Andrei não.) Esses pioneiros influenciaram muito o campo, e basicamente o que deveria ser escrito agora está escrito. Pessoalmente, eu aconselharia Vandevoorde & Josuttis. O livro de Alexandrescu é difícil se você é novo no campo.

MSalters
fonte
4

Os artigos originais de Veldhuizen eram bons. Se você quiser um livro inteiro, então há o livro de Vandevoorde, "Guia completo dos modelos C ++". E quando você estiver pronto para o curso de mestrado, experimente o Modern C ++ Design de Alexandrescu.

eduffy
fonte
4

google Alexandrescu, Modern C ++ Design: Generic Programming and Design Patterns Applied

Maxim Ananyev
fonte