2016-10-27 59 views
0

我希望能夠專注基於一種類型的容器是否具有例如如何專門基於模板參數是否有別名

class SomethingElse {}; 
class Something { 
    using Type = int; 
}; 

static constexpr bool value = ChooseIfType<Something>::value; 

指定的typedef類型是否有ChooseIfType辦法當類型沒有typedef Type時返回false?

我覺得有一個簡單的方法來做到這一點,但我無法弄清楚。

謝謝!

+0

您可以在類中檢查是否有具體的名字,但你的問題好像是問,如果你可以,如果該類型告訴有任何別名。這是什麼? – krzaq

+0

@krzaq澄清! – Curious

回答

2

只需使用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; 
+0

你能解釋一下這是如何工作的嗎?當void_t的默認替換格式錯誤時會發生什麼? – Curious

+0

@Curious這是你喜歡的嗎? – krzaq

+0

但是'void_t <>'和'void_t '是一樣的嗎?根據http://en.cppreference.com/w/cpp/types/void_t – Curious

相關問題