在C++中17,我們有std::void_t
,這使得SFINAE看起來要好很多:是否有其他類型的void_t的標準泛化?
template <typename T>
std::void_t<decltype(T::prop)> foo() { /* stuff */ }
模板功能將只存在,如果存在T::prop
。
如果T::prop
存在,模板功能foo()
將是相同的:
template <typename T>
void foo() { /* stuff */ }
否則,代碼就等於沒有宣佈foo()
可言。
是否有其他類型的標準庫的std::void_t
任何概括,如下列:
template<typename T, typename...>
using generic_t = T;
,使下面的代碼將是有效的?
template <typename T>
std::generic_t<int, decltype(T::prop)> foo() { /* stuff */ }
這將等同於
template <typename T>
int foo() { /* stuff */ }
如果T::prop
存在?
爲什麼不'decltype (T :: prop,int())'?這不行嗎? – Justin
@Justin因爲'std :: void_t'忽略了它的參數類型。無論如何,它都將是「無效的」。 – Rakete1111
我想你可以做'std :: tuple_element_t <0,std :: tuple>' –