如果您使用的std::conditional
代替if_
類模板由@Matthieu在他的回答中實現,那麼你的解決方案將減少到這一點:
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> {};
看起來甚至更好。
這兩種解決方案之間的區別是,在第一個解決方案你嵌套類型給予程序員友好的名字,因爲我已經給它base_type
,而在第二個解決方案的嵌套式只是type
這看起來不像程序員友好。
注意,在上述兩種解決方案,你已經使用嵌套的類型或者select_base<T,U>::base_type
(第一溶液)或select_base<T,U>::type
(在因爲第二個解決方案—,如果你已經使用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
as:
template <typename T1, typename T2>
struct test
{
//typename select_base<T1, T2>::type m_ValueOfBaseType; //ugly!
base_type<T1, T2> m_ValueOfBaseType; //better
};
希望有幫助。
你的問題是什麼? – Nawaz
你的問題不清楚。你想從兩種類型'T1'或'T2'中選擇基本類型,例如,如果'T1'從'T2'派生,那麼輸出類型應該是'T2'。或者你想選擇從第三種類型派生的類型,比如'base'? – Nawaz
@Nawaz:從鏈接的ideone中,我會說'Base'是固定的,他想選擇從其中導出的'T1'或'T2'中的任何一個。 –