最も一般的でない祖先アルゴリズムについてはたくさんの質問がありますが、コンパイル時に LCA を決定しようとしており、単純化されたバージョンは次のように見えるかもしれませんが、ツリーはバイナリでも検索ツリーでもないため、これは異なります。 1。
parent
別の同様の構造であるメンバー typedef を含む一連の構造があるとします。
struct G
{
typedef G parent; // 'root' node has itself as parent
};
struct F
{
typedef G parent;
};
struct E
{
typedef G parent;
};
struct D
{
typedef F parent;
};
struct C
{
typedef F parent;
};
struct B
{
typedef E parent;
};
struct A
{
typedef E parent;
};
一緒に次のような木を作ります
A B C D
\ / \ /
E F
\ /
\ /
\ /
G
注: 構造体間に継承関係はありません。
私がやりたいのは、次のような型特性を作成するleast_common_ancestor
ことです。
least_common_ancestor<A, B>::type; // E
least_common_ancestor<C, D>::type; // F
least_common_ancestor<A, E>::type; // E
least_common_ancestor<A, F>::type; // G
これを行う最善の方法は何ですか?
特にツリーの深さが小さいため、アルゴリズムの複雑さには関心がありません。むしろ、正しい答えに到達する最も単純なメタプログラムを探しています。
編集:他のコンパイラの中でもmsvc2013でソリューションを構築できる必要があるため、ない回答constexpr
が優先されます。