A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Metaprogramação Estática André Knabben Pricilla Padaratz.

Apresentações semelhantes


Apresentação em tema: "Metaprogramação Estática André Knabben Pricilla Padaratz."— Transcrição da apresentação:

1 Metaprogramação Estática André Knabben Pricilla Padaratz

2 Metaprogramação Envolve escrever programas relacionados pela meta-relação  relação de “ser sobre” Programas que manipulam e geram outros programas

3 Metaprogramação Estática Metaprogramas estáticos são executados antes do código que eles manipulam  em tempo de compilação Compiladores e pré-processadores Open Compiler  tornar a metaprogramação mais acessível

4 Templates Metaprogramação em C++ Classes e funções que operam com números e/ou tipos como dados Recursão de templates Especialização de templates

5 Templates Compilador executa operações  codificam- se dados como tipos  usa-se o compilador para interpretar metaprogramas Templates  Reutilizar código fonte X Herança e Composição  Reutilizar código de objetos

6 Classes Implementação de templates genéricos com paramêtros de tipo Compilador gera a classe de acordo com o tipo Por exemplo: template class Fila {...} Fila, Fila, etc.

7 Funções Implementação de funções genéricas que podem ser usadas com tipos arbitrários Compilador gera código de acordo com o tipo Rotinas de busca, rotinas de sort Exemplo: template T max(T a, T b) { return a > b ? a : b; }

8 Especialização É possível definir especializações de templates para tipos específicos Especialização de classes e de funções Exemplo: template class Lista {... } template<> class Lista {... } O template Lista é usado para definir Listas de caracteres; outras Listas serão geradas a partir do template base Lista

9 Especialização Parcial Usada para gerar especializações de templates onde alguns parâmetros permanecem fixos e outros variam Não são suportados por todos os compiladores – Suportado pelos GCC mais recentes – Suportado pelo compilador da Intel – Não suportado pelo Visual C++ 6.0

10 Exemplo template struct IF { typedef ThenType RET; }; template struct IF { typedef ElseType RET; };

11 Meios de prover informação sobre tipos Definir um traits template para o tipo: Traits templates provêem informações sobre outros tipos Colocar a informação diretamente como parte do tipo (member traits) Criar uma classe com os traits (trait classes)

12 Promoção de tipos Traits podem ser usados para promover tipos – X = Y + Z: resultado da operação + assume tipo de acordo com algum critério (int + double => double) Exemplo de uso: classes matemáticas

13 Princípios de Codificação Typedef: atribuição para tipo Enum: atribuição para valor Recursão de template: loop Operador ? : e especialização de template: condicional Uso de namespace e private/protected para ocultar operações intermediárias

14 Instantiation/Lazyness Compilador instancia templates apenas quando necessário Ex: template struct X { /*code */} typedef X X_INT; // não X_INT *x; // não X_INT x; // sim

15 Instantiation/Lazyness template class Uma { typedef T_ Tipo; }; template class Outra { typedef T_ Tipo; }; typedef IF ::Tipo, Outra ::Tipo>::RET TIPO1; // ruim typedef IF, Outra >::RET::Tipo TIPO1; // bom template class vector ; // instanciação explícita

16 Outros templates como parâmetro template struct Base { /* code */ } template < class ElementType, template class ListType > struct ListUser { typedef ListType > MyList; };

17 Alternativa: Criar estrutura para passar um parâmetro template struct UsarTipo1 { template struct UseType { typedef Tipo1 RET; }; }; template struct ListUser { typedef TipoTemplate::UseType >::RET MyList; };

18 Expression Templates Servem para otimizar/restringir o uso de expressões usando redefinição de operadores M1 = (M2 + M3 + M4) * M5; Permite: – Armazenar as operações a serem executadas e otimizar a expressão (incluindo as mesmas otimizações que o compilador faria); – Adicionar restrições adicionais do domínio tratado.

19 Exemplo: Expression Templates (4 * 3) + 10

20 Modelagem Lista

21

22 Código

23 Compilando com o G++ In file included from lista.h:6, from lista.cpp:1: smp_inherit.h:39: parse error before `;' token template struct UseType { typedef typename Type RET; };

24 Problemas Ferramentas/compiladores não estão preparadas para o uso intensivo de templates – Não há como verificar como o compilador está instanciando os templates – Problemas com o debug – Mensagens de erro ruins – Recursos de autocompletar não funcionam

25 Ex. Mensagem do compilador Z:\SMP\teste\src\main.cpp(66): error: no suitable constructor exists to convert from "LinkedNode >>>::NodeType *" to "DoublyLinkedNode<GenerateSubCla ssInternals::GenerateSubClass_ >>::Env={int}, LinkedNode<GenerateSubClass<int, LinkedNode, SubTypeList >>>, SubTypeList >>::Env={GenerateSubClass<int, LinkedNode, SubTypeList<DoublyLinkedNode, SubTypeList<LengthNode, EndTy peList>>>::Env={int}}, LinkedNode >>>, SubTypeList >::Tail>::RET>" *last = (x.next)->next->next;

26 Bibliografia CZARNECKI, K., EISENECKER, U. Generative Programming: Methods, Techniques and Applications. Addison-Wesley, 2000. C++ Templates Tutorial: http://babbage.cs.qc.edu/STL_Docs/templates.htm


Carregar ppt "Metaprogramação Estática André Knabben Pricilla Padaratz."

Apresentações semelhantes


Anúncios Google