Mam problem, w którym muszę odkryć wspólnego przodka dwóch typów (z jedną lub zerowymi klasami podstawowymi), jeśli istnieje. Czy możliwe jest zbudowanie cechy typowej w celu rozwiązania tego problemu? W kodzie:Jak wydedukować, w czasie kompilacji, główny katalog drzewa dziedziczenia wspólnego dla dwóch typów, jeśli taki istnieje?
template<typename T1, typename T2>
struct closest_common_ancestor
{
typedef XXX type; // what goes here?
};
Przy następujących typów:
struct root {};
struct child1 : root {};
struct child2 : root {};
struct child3 : child2 {};
struct unrelated {};
closest_common_ancestor
doprowadziłoby do następujących typów:
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
Wierzę, że mogę rozwiązać ten problem, czy mogę sprawdzić, czy type ma zero lub jedną klasę podstawową, a jeśli tak, to nazwę tego typu. czy to możliwe?
Nie można kontrolować klas podstawowych. Nie, chyba że ręcznie dodasz metadane do każdej z twoich klas. –
Zauważ, że dla bezpośredniego związku jest to już możliwe ('is_base_of' może być zaimplementowane pod względem podstawowych bloków C++ 03) –
Jeśli są 2 korzenie' root1' i 'root2' i' child1', dziedziczenie 'child2' oba z nich ('struct child1: root1, root2 {};'), będzie niejednoznaczne dla 'closest_common_ancestor', co zwrócić. – kennytm