Usos práticos para o “Curiosamente Recorrente Padrão Modelo”
-
02-07-2019 - |
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.
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
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.