Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouRafael Manuel Alterado mais de 9 anos atrás
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
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
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.