Ho un problema in cui ho bisogno di scoprire l'antenato comune di due tipi (con una o zero classi di base) se esiste. È possibile costruire un tratto di tipo per risolvere questo problema? In Codice:Come dedurre, in fase di compilazione, la radice di un albero ereditario comune a due tipi se ne esiste uno?
template<typename T1, typename T2>
struct closest_common_ancestor
{
typedef XXX type; // what goes here?
};
Dati i seguenti tipi:
struct root {};
struct child1 : root {};
struct child2 : root {};
struct child3 : child2 {};
struct unrelated {};
closest_common_ancestor
comporterebbe nei seguenti tipi:
closest_common_ancestor<root, child1>::type == root
closest_common_ancestor<child1, child2>::type == root
closest_common_ancestor<child3, child1>::type == root
closest_common_ancestor<child3, child2>::type == child2
closest_common_ancestor<unrelated, child1>::type == error
credo di poter risolvere questo problema se posso controllare se un il tipo ha zero o una classe base e, in tal caso, il nome di quel tipo. È possibile?
Non è possibile esaminare le classi di base. A meno che tu non aggiunga manualmente le meta informazioni a ciascuna delle tue classi. –
Si noti che per una relazione diretta è già possibile ('is_base_of' può essere implementato in termini di blocchi C++ 03 di base) –
Se ci sono 2 root' root1' e 'root2', e' child1', 'child2' eredita entrambi ('struct child1: root1, root2 {};'), sarà ambiguo per 'closest_common_ancestor' cosa restituire. – kennytm