[心得] 編譯時確定函數有無宣告

看板C_and_CPP (C/C++)作者 (咕啾咕啾魔法陣)時間8年前 (2017/10/24 10:19), 8年前編輯推噓1(1017)
留言18則, 4人參與, 8年前最新討論串1/1
class nothing; nothing f(nothing);//避免f沒宣告時編譯錯誤 template<typename Type,Type Ptr> class helper; //存在f,且型態與Type相符時才展開這個,Type即用來確認的函數指標型別 template<typename Type> char check_f(helper<Type,&f> *); //失敗時展開這個 template<typename Type> int check_f(...); template<typename Type> struct has_fun_f{ enum {value=sizeof(check_f<Type>(0))==sizeof(char)}; }; 範例: has_fun_f<int (*)()>::value 配合macro,可把f替換為任一想確認的函數名稱 code稍微改一下可用來確認class成員 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.236.68.9 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1508811595.A.088.html ※ 編輯: loveflames (36.236.68.9), 10/24/2017 10:38:19

10/24 20:58, 8年前 , 1F
比較精確的說應該是你要判斷函數有沒有你想要的overload吧
10/24 20:58, 1F

10/24 21:00, 8年前 , 2F
cout ?
10/24 21:00, 2F

10/24 21:01, 8年前 , 3F
C++17 + std::is_detected TS
10/24 21:01, 3F

10/24 21:01, 8年前 , 4F

10/24 21:02, 8年前 , 5F
用 C++20 concepts (目前gcc實做的語法和最終有點差異)
10/24 21:02, 5F

10/24 21:02, 8年前 , 6F

10/24 21:20, 8年前 , 7F
我很想知道有沒有辦法確認函數有無定義,卻又能編譯通
10/24 21:20, 7F

10/24 21:20, 8年前 , 8F
過的方式
10/24 21:20, 8F

10/24 21:21, 8年前 , 9F
目前我只知道constexpr函數特定情況下能用noexcept判
10/24 21:21, 9F

10/24 21:21, 8年前 , 10F
10/24 21:21, 10F

10/24 21:51, 8年前 , 11F
定義可能是在別的translation unit裡面 除非到link時才知道
10/24 21:51, 11F

10/24 21:56, 8年前 , 12F
請問一下 check_f如果傳入Type有找到,為啥會優先走help
10/24 21:56, 12F

10/24 21:56, 8年前 , 13F
er為參數的版本?是什麼規則嗎
10/24 21:56, 13F

10/24 21:57, 8年前 , 14F
另外一開始的f存在意義是什麼?感覺可以拿掉?
10/24 21:57, 14F

10/25 10:07, 8年前 , 15F
variadic argument在overload的rank最低
10/25 10:07, 15F

10/25 10:07, 8年前 , 16F
如果helper<...>沒有因為SFINAE被剃除的話 就會優先選擇它
10/25 10:07, 16F

10/25 10:08, 8年前 , 17F
f存在是舉例用避免undeclared identifier
10/25 10:08, 17F

10/25 10:09, 8年前 , 18F
loveflames: 突然想到你可以用weak function去判斷吧
10/25 10:09, 18F
文章代碼(AID): #1PxgDB28 (C_and_CPP)
文章代碼(AID): #1PxgDB28 (C_and_CPP)