開發平台(Platform): (Ex: Win10, Linux, ...)
Visual Studio 2018
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
VC++
問題
1.
decltype(&C::helloworld) 的型別是不是為 void (has_helloworld_class::*)()
2. 為何
typename C::helloworld* 無法通過編譯
以下正文
因為最近對如果在C++ template中想要因所擁有的成員函數不同而有不同行為的話該如何使用
這邊是我上網查到的code,其實我也不是很清楚是如何運作的
https://ideone.com/wNyohz
小弟在這裡試試看解讀以上的code
因為C++的 SFINAE 所以會從 test 中找到最適合的一個 template
當 has_helloworld_class 被帶入時,因為有 helloworld 函數,
所以第一個 test 函數是最好的函數而被判斷返回值,
依照返回值的大小來判斷哪個 test function 被評估
不過這裡我不太懂 decltype(&C::helloworld) 是甚麼型別,這跟
void (has_helloworld_class::*)()
是一樣的型別嗎?
當我在 Wekipedia 搜尋相關資料時,跑了遺下他們的範例結果發現無法編譯成功
https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error#Example
這裡的程式碼我看得懂,也就是但是不知為何
template <typename C>
static yes& test(typename C::foobar*);
此句一直編譯失敗,Wekipedia 上面的範例就是傳入 nullptr,並評估兩個 test function 何者編譯成功
謝謝大大們看完此篇文章