У меня есть проблема, когда мне нужно обнаружить общего предка двух типов (с одним или нулевым базовым классом), если он существует. Можно ли построить черту типа для решения этой проблемы? В коде:
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
Я считаю, что смогу решить эту проблему, если смогу проверить, имеет ли тип ноль или один базовый класс, и если да, то имя этого типа. Это возможно?
is_base_of
может быть реализовано с точки зрения базовых блоков C++03) - person Matthieu M.   schedule 03.11.2011root1
иroot2
, аchild1
,child2
наследуют их оба (struct child1 : root1, root2 {};
), то дляclosest_common_ancestor
будет неоднозначно что возвращать. - person kennytm   schedule 04.11.2011