[問題] C++ template 確定函式是否存在
開發平台(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 何者編譯成功
謝謝大大們看完此篇文章
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 43.243.253.180
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1543757206.A.0B3.html
推
12/02 21:54,
5年前
, 1F
12/02 21:54, 1F
→
12/02 21:54,
5年前
, 2F
12/02 21:54, 2F
https://ideone.com/Ad4UdD
那可以請大大幫我看看為何我兩個輸出的答案都是 false 嗎?
※ 編輯: mikukonn (43.243.253.180), 12/02/2018 22:46:36
→
12/02 23:04,
5年前
, 3F
12/02 23:04, 3F
→
12/02 23:05,
5年前
, 4F
12/02 23:05, 4F
→
12/02 23:08,
5年前
, 5F
12/02 23:08, 5F
→
12/02 23:28,
5年前
, 6F
12/02 23:28, 6F
→
12/02 23:29,
5年前
, 7F
12/02 23:29, 7F
→
12/02 23:30,
5年前
, 8F
12/02 23:30, 8F
→
12/02 23:32,
5年前
, 9F
12/02 23:32, 9F
→
12/02 23:33,
5年前
, 10F
12/02 23:33, 10F
→
12/02 23:34,
5年前
, 11F
12/02 23:34, 11F
→
12/02 23:36,
5年前
, 12F
12/02 23:36, 12F
→
12/02 23:44,
5年前
, 13F
12/02 23:44, 13F
→
12/02 23:44,
5年前
, 14F
12/02 23:44, 14F
→
12/02 23:47,
5年前
, 15F
12/02 23:47, 15F
→
12/02 23:47,
5年前
, 16F
12/02 23:47, 16F
→
12/02 23:48,
5年前
, 17F
12/02 23:48, 17F
→
12/02 23:49,
5年前
, 18F
12/02 23:49, 18F
→
12/02 23:51,
5年前
, 19F
12/02 23:51, 19F
→
12/02 23:52,
5年前
, 20F
12/02 23:52, 20F
→
12/02 23:52,
5年前
, 21F
12/02 23:52, 21F
→
12/02 23:57,
5年前
, 22F
12/02 23:57, 22F
→
12/02 23:57,
5年前
, 23F
12/02 23:57, 23F
→
12/02 23:57,
5年前
, 24F
12/02 23:57, 24F
→
12/03 00:11,
5年前
, 25F
12/03 00:11, 25F
→
12/03 00:11,
5年前
, 26F
12/03 00:11, 26F
→
12/03 00:19,
5年前
, 27F
12/03 00:19, 27F
→
12/03 00:20,
5年前
, 28F
12/03 00:20, 28F
→
12/03 00:21,
5年前
, 29F
12/03 00:21, 29F
→
12/03 00:21,
5年前
, 30F
12/03 00:21, 30F
→
12/03 00:22,
5年前
, 31F
12/03 00:22, 31F
→
12/03 00:22,
5年前
, 32F
12/03 00:22, 32F
→
12/03 00:28,
5年前
, 33F
12/03 00:28, 33F
→
12/03 00:29,
5年前
, 34F
12/03 00:29, 34F
→
12/03 00:43,
5年前
, 35F
12/03 00:43, 35F