@Matthieuが彼の回答で実装したクラステンプレートstd::conditional
の代わりに使用する場合、ソリューションは次のようになります。if_
template <typename T, typename U>
struct select_base
{
typedef typename std::conditional<std::is_base_of<T, Base>::value, T, U>::type base_type;
};
または単にこれ:
template <typename T, typename U>
struct select_base : std::conditional<std::is_base_of<T, Base>::value, T, U> {};
これはさらに良く見えます。
これら2つのソリューションの違いは、最初のソリューションでは、私が付けたように、ネストされた型にプログラマーにわかりやすいbase_type
名前を付けるのに対し、2番目のソリューションでは、ネストされた型はtype
プログラマーにわかりにくい名前になっていることです。 。
上記の両方のソリューションでは、ネストされたタイプをselect_base<T,U>::base_type
(最初のソリューションで)またはselect_base<T,U>::type
(2番目のソリューションで)使用する必要があることに注意してください。そのためtypename
、質問自体。
ただし、代わりにテンプレートエイリアスを使用する場合は、次のように定義されます。
template<typename T, typename U>
using base_type = typename std::conditional<std::is_base_of<T, Base>::value, T, U>::type;
次にbase_type<T,U>
、ネストされたタイプなしで、次のように使用できますtypename
。
template <typename T1, typename T2>
struct test
{
//typename select_base<T1, T2>::type m_ValueOfBaseType; //ugly!
base_type<T1, T2> m_ValueOfBaseType; //better
};
お役に立てば幸いです。