我一直在試圖通過閱讀下面的文章Link瞭解SFINAE的招數,但在理解它的某些部分有困難。需要澄清lambda表達式,汽車和decltype在SFINAE
全碼:Link
我感到困惑主要是關於這些代碼行。
// Check if a type has a serialize method.
auto hasSerialize = is_valid([](auto&& x)
-> decltype(x.serialize()) { });
template <class T> auto serialize(T& obj)
-> typename std::enable_if<decltype(hasSerialize(obj))::value, std::string>::type
{
return obj.serialize();
}
template <class T> auto serialize(T& obj)
-> typename std::enable_if<!decltype(hasSerialize(obj))::value, std::string>::type
{
return to_string(obj);
}
尤其是使用hasSerialize行,它在帶參數的decltype中使用。誰能告訴我這裏有什麼? hasSerialize是一種方法嗎? hasSerialize右側的表達式(lambda)將實際計算爲什麼?評估中的執行順序是什麼?在hasSeriaize中,auto會評估什麼?
請幫我理解這是我與這個掙扎了一個星期,但仍不能我的頭周圍。如果任何人能舉一個這樣的實際例子,將不勝感激。
感謝
謝謝您的回答。我會盡量回答你的答案,並通過閱讀關於lamdas的更多內容來了解這一點(關閉,因爲我仍然沒有從你的鏈接中得到它)。一天後會回覆你。 –