Como combinar modelo e herança

5

Eu tenho várias fábricas, cada uma é responsável por criar instâncias de uma árvore de herança. Por exemplo (sintaxe ou semântica talvez incorreta),

struct InterfaceA {};  struct ImplA1 : InterfaceA {}; ... 
struct FactoryA { vector<InterfaceA*> create(); }    
... // (repeat for B, C, etc)

foo é a classe de modelo

template<ATy, BTy, ..>
struct foo {
     // default behavior - no functionality
};

foo é especializado para alguma combinação de subclasses de InterfaceA, InterfaceB e ...

template<>
struct foo<ImplA1, ImplB2, ..> {
     void feature1();
     void feature2();
};

É possível combinar as hierarquias de herança com a classe de modelo? ou seja,

void bar(vector<InterfaceA*> vecA, vector<InterfaceB*> vecB, ..) {
    foo< /* what to put in here */ >(vecA.front(), vecB.front(), ...) f;
    f.feature1();  // if specialization not there, complain
}

Eu posso usar Curiously Recurring Template Pattern (CRTP) para uma árvore. Não sei como fazê-lo funcionar com várias árvores.

    
por Candy Chiu 18.05.2016 / 22:16
fonte

1 resposta

1

Parece que você quer é:

void bar(vector<InterfaceA*> vecA, vector<InterfaceB*> vecB) {
    // If InterfaceA == ImplA1 && InterfaceB == ImplB2 then:
    foo<ImplA1, ImplB2> f(*dynamic_cast<const ImplA1*>(vecA.front()), *dynamic_cast<const ImplB2*>(vecB.front()));
    // ...
    f.feature1();  // if specialization not there, complain
}

o que não é possível, porque a instanciação do modelo é uma coisa em tempo de compilação e você quer tomar uma decisão sobre um tipo de tempo de execução dinâmico. (Btw. Mesmo acima só funciona se você der a InterfaceA|B um ditor virtual.)

Então, do seu comentário // if spec not there, complain , posso afirmar isso:

  • Você não pode reclamar em tempo de compilação, porque a decisão de fazer é baseada em informações de tempo de execução
  • Você poderia escrever um dispatcher de tempo de execução que seleciona a instanciação de modelo correta (ou falha com, por exemplo, uma exceção) em tempo de execução: Como fazer isso é outra história, possivelmente melhor respondida em SO .
por 15.08.2018 / 08:52
fonte

Tags