只需使用std::void_t
(或C++ 11替代):
template<typename T, typename = std::void_t<>>
struct ChooseIfType : std::false_type {};
template<typename T>
struct ChooseIfType<T, std::void_t<typename T::Type>> : std::true_type {};
live demo
將該溶液利用SFINAE的。默認值永遠不會變形,並創建一個值爲false的特徵。編譯器試圖匹配所有的模板特化(在這種情況下只有一個)。如果T
具有成員類型Type
,則ChooseIfType<T, void_t<typename T::Type>>
比ChooseIfType<T, void_t<>>
更專業。如果沒有,那麼這不是一個可行的專業化,並且選擇了默認值,但替換失敗不是錯誤。
按照cppreference,一個C++ 11 void_t
實施看起來是這樣的:
template<typename... Ts> struct make_void { typedef void type;};
template<typename... Ts> using void_t = typename make_void<Ts...>::type;
您可以在類中檢查是否有具體的名字,但你的問題好像是問,如果你可以,如果該類型告訴有任何別名。這是什麼? – krzaq
@krzaq澄清! – Curious