Come combinare template ed ereditarietà

5

Ho più fabbriche, ognuna delle quali è responsabile della creazione di istanze di un albero ereditario. Ad esempio (sintassi o semantica potrebbero non essere corrette),

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

foo è la classe template

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

foo è specializzato per alcune combinazioni di sottoclassi di InterfaceA, InterfaceB e ...

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

È possibile combinare le gerarchie di ereditarietà con la classe template? cioè.

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
}

Posso usare Pattern modello curiosamente ricorrente (CRTP) per un albero. Non sai come farlo funzionare con alberi multipli.

    
posta Candy Chiu 18.05.2016 - 22:16
fonte

1 risposta

1

Sembra che tu voglia:

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
}

che non è possibile, perché l'istanziazione del template è una cosa in fase di compilazione e si desidera prendere una decisione su un tipo di esecuzione dinamica. (Btw. Even above only funziona solo se date a InterfaceA|B un virtual d'tor.)

Quindi dal tuo commento // if spec not there, complain Posso dire questo:

  • Non puoi lamentarti al momento della compilazione, perché la decisione di effettuare è basata sulle informazioni di runtime
  • Potresti scrivere un dispatcher di runtime che seleziona la corretta istanziazione del modello (o che non riesce ad esempio con un'eccezione) in fase di esecuzione: come farlo è un'altra storia, forse la cosa migliore è richiesta a SO .
risposta data 15.08.2018 - 08:52
fonte

Leggi altre domande sui tag