Pergunta

Quais são alguns usos práticos para o " Curiosamente recorrentes Template Pattern "? A "classe contados " exemplo comumente mostrado apenas não é um exemplo convincente para mim.

Foi útil?

Solução

ligação Simulado dinâmico. Evitando o custo das chamadas de função virtual, mantendo alguns dos benefícios hierárquicos é uma enorme vitória para os subsistemas de onde ele pode ser feito no projeto que eu estou trabalhando atualmente.

Outras dicas

Também é especialmente útil para mixins (pelo qual eu aulas significa que herdam para fornecer funcionalidade) que se precisa saber que tipo eles estão operando em (e, portanto, precisa ser templates).

efectiva C ++ , Scott Meyers proporciona como um exemplo de uma classe de modelo NewHandlerSupport . Este contém um método estático para substituir o novo manipulador para uma classe particular (da mesma forma que std :: set_new_handler faz para o operador padrão novo), e um operador novo que usa o manipulador. A fim de fornecer um manipulador per-tipo, a classe pai precisa saber que tipo ele está agindo em, por isso precisa ser um modelo de classe. O parâmetro do modelo é a classe infantil.

Você não poderia realmente fazer isso sem CRTP, desde que você precisa o modelo NewHandlerSupport a ser instanciado separadamente, com um membro de dados estáticos separado para armazenar o new_handler atual, por classe que o utiliza.

Obviamente toda a exemplo é extremamente não-thread-safe, mas ilustra o ponto.

Meyers sugere que CRTP pode ser pensado como "Do It For Me". Eu diria que este é geralmente o caso para qualquer mixin, e CRTP se aplica no caso em que você precisa de um modelo de mixin em vez de apenas uma classe mixin.

O CRTP recebe muito menos curioso, se você considerar que o tipo de subclasse que é passado para a superclasse só é necessária no momento da expansão método. Assim, pois, todos os tipos são definidos. Você só precisa o padrão para importar o tipo de subclasse simbólica na superclasse, mas é apenas uma declaração para a frente - como todos param modelo formal de tipos são, por definição -., Tanto quanto a superclasse está em causa

Nós usamos em uma forma ligeiramente modificada, passando a subclasse em uma estrutura do tipo traços para a superclasse para torná-lo possível para a superclasse para retornar objetos do tipo derivado. A aplicação é uma biblioteca para cálculo geométrico (pontos, vetores, linhas, caixas), onde toda a funcionalidade genérico é implementado na superclasse e a subclasse apenas define um tipo específico: CFltPoint herda de TGenPoint. Também CFltPoint existia antes TGenPoint, então subclasse era uma forma natural de refatoração isso.

Geralmente é usado para polimórfica-like padrões onde você não precisa de ser capaz de escolher a classe derivada em tempo de execução, somente em tempo de compilação. Isso pode salvar a sobrecarga da chamada de função virtual em tempo de execução.

Para um uso da biblioteca real de CRTP, olhada ATL e WTL (wtl.sf.net). Ele é usado extensivamente lá para o polimorfismo em tempo de compilação.

Parece algo como C macro:. Aproveite que a macro não é compilado no momento da definição, mas ao tempo de uso

#define CALL_THE_RIGHT_FOO foo()

Um arquivo:

static void foo() {
   // do file A thing
}
...
CALL_THE_RIGHT_FOO
...

Um arquivo:

static void foo() {
   // do file B thing
}
...
CALL_THE_RIGHT_FOO
...

O padrão de uso de modelo que você está descrevendo permite-nos que "chamar o foo direito" no modelo de pai, adiando a definição do que exatamente a foo direito é, até o modelo é instanciado. Exceto neste caso, é a distinção entre ClassA :: foo e ClassB :: foo com base no valor de T em Parent.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top