У меня проблема, когда мне нужно найти общего предка двух типов (с одним или нулевым базовым классом), если он существует. Можно ли построить свойство типа для решения этой проблемы? В коде:
template<typename T1, typename T2>
struct closest_common_ancestor
{
typedef XXX type; // what goes here?
};
Для следующих типов:
struct root {};
struct child1 : root {};
struct child2 : root {};
struct child3 : child2 {};
struct unrelated {};
closest_common_ancestor
приведет к следующим типам:
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
Я считаю, что могу решить эту проблему, если я могу проверить, имеет ли тип нулевой или один базовый класс, и если да, то название этого типа. Возможно ли это?