如果您將每個班級別名設置爲base
(如下所示),則可以完成。由T2
每個基地比較T1
template <class T1, class T2>
struct CommonBase;
CommonBase
作品:
struct Child : Parent { using base = Parent; }; //typedef works too
我創建了一個struct
。當它到達頂級基地時,它會再次從底部開始,但是與T1
的基數進行比較。
例如:CommonBase<RL, RR>
會經過以下檢查:
RL != RR
RL != R
RL != Top
R != RR
R == R
所以CommonBase<RL, RR>::type == R
。如果沒有共同基地,type == void
。
我把代碼在最後,因爲模板元編程是如此可愛:
#include <type_traits>
template <class T>
struct GetBase //type = T::base, or else void
{
template <class TT> static typename TT::base& f(int);
template <class TT> static void f(...);
typedef std::remove_reference_t<decltype(f<T>(0))> type;
};
template <class T1, class T2>
struct Compare2 //Compares T1 to every base of T2
{
typedef typename GetBase<T2>::type _type;
template <class T, bool = !std::is_same<T, void>::value>
struct helper
{
typedef typename Compare2<T1, T>::type type;
};
template <class T>
struct helper<T, false>
{
typedef void type;
};
typedef typename helper<_type>::type type;
};
template <class T>
struct Compare2<T, T>
{
typedef T type;
};
template <class T1, class T2>
struct Compare1 //Uses Compare2 against every base of T1
{
typedef typename GetBase<T1>::type _type;
template <class T, bool = !std::is_same<T, void>::value>
struct helper
{
typedef typename Compare1<T, T2>::type type;
};
template <class T>
struct helper<T, false>
{
typedef void type;
};
typedef std::conditional_t<std::is_same<typename Compare2<T1, T2>::type, void>::value, typename helper<_type>::type, typename Compare2<T1, T2>::type> type;
};
template <class T>
struct Compare1<T, T> //Probably redundant
{
typedef T type;
};
template <class T1, class T2>
struct CommonBase //You can throw a std::enable_if on this to limit it to class types
{
typedef typename Compare1<T1, T2>::type type;
};
Here你可以看到它的一些測試用例。
'common_base :: type'是'RR'還是'R'? –
@JamesRoot,'RR'。 – alfC