Quando se deve usar especialização de template, se não para metaprogramação?

5

Quando usamos especializações de modelo em C ++, senão para SFINAE ou metaprogramação? type_traits , enable_if e outros confiam muito nisto, mas estou mais curioso sobre situações que são usos mais "óbvios" de modelos - algoritmos e objetos agnósticos de tipos.

Pode-se criar facilmente um exemplo artificial de algoritmo que faz coisas completamente diferentes para tipos diferentes, por isso gostaria de limitar o escopo a cenários mais "reais". Especificamente, as seguintes propriedades devem ser satisfeitas:

  1. Pode-se formular uma invariante de uma versão genérica do modelo (por isso, faz sentido falar em especialização ) e
  2. A versão especializada não viola quaisquer invariantes da versão genérica (se o fizer, provavelmente é uma má especialização e uma classe / função separada deve ser criada).

Eu tenho três exemplos em mente:

  • %código%. É conhecido por ter uma interface diferente do genérico std::vector<bool> ( 1 , 2 ) e, portanto, considero um mau exemplo - ele não satisfaz a propriedade 2.
  • %código%. Apesar de não ter implementação "genérica", tem invariante "genérico".
  • %código%. Satisfaz as duas propriedades.

Estes exemplos, no entanto, parecem muito específicos para mim. Eu estou querendo saber se é possível descrever quando se deve usar a especialização de modelo. Por exemplo. "se você tiver um contêiner de tipo agnóstico que tenha uma implementação estritamente melhor para algum tipo específico" provavelmente é verdade, mas, novamente, bastante específico.

    
por yeputons 05.03.2017 / 11:35
fonte

2 respostas

2

When one should use template specialization, if not for metaprogramming?

A coisa "clássica", e até mesmo aquela que você menciona no final, é refinar uma determinada implementação genérica para um tipo específico (conjunto de).

O exemplo principal aqui seria "otimizações" de contêiner ou algoritmo para tipos triviais. (Veja, por exemplo, std :: copy )

Não há nada meta sobre isso até onde eu posso dizer: para alguns tipos, uma determinada versão especializada será objetivamente melhor, mantendo todos os requisitos da versão genérica, então ela será implementada assim que for necessário.

    
por 25.03.2017 / 22:37
fonte
0

Em algum ponto, algumas bibliotecas padrão C ++ continham especializações dos contêineres para qualquer T *, tornando-as finas em torno de containers de void *.

Isso foi feito para reduzir a duplicação de código gerada.

Alguns linkers modernos são capazes de eliminar essa duplicação de código automaticamente, reduzindo assim a necessidade de tais soluções alternativas.

    
por 27.03.2017 / 11:12
fonte

Tags