Как определить во время компиляции корень дерева наследования, общего для двух типов, если он существует?

У меня проблема, когда мне нужно найти общего предка двух типов (с одним или нулевым базовым классом), если он существует. Можно ли построить свойство типа для решения этой проблемы? В коде:

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

Я считаю, что могу решить эту проблему, если я могу проверить, имеет ли тип нулевой или один базовый класс, и если да, то название этого типа. Возможно ли это?

9
задан Jared Hoberock 3 November 2011 в 08:41
поделиться