看板 C_and_CPP 關於我們 聯絡資訊
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
PkmX: 比較精確的說應該是你要判斷函數有沒有你想要的overload吧 10/24 20:58
kingofsdtw: cout ? 10/24 21:00
PkmX: C++17 + std::is_detected TS 10/24 21:01
PkmX: 用 C++20 concepts (目前gcc實做的語法和最終有點差異) 10/24 21:02
loveflames: 我很想知道有沒有辦法確認函數有無定義,卻又能編譯通 10/24 21:20
loveflames: 過的方式 10/24 21:20
loveflames: 目前我只知道constexpr函數特定情況下能用noexcept判 10/24 21:21
loveflames: 斷 10/24 21:21
PkmX: 定義可能是在別的translation unit裡面 除非到link時才知道 10/24 21:51
lovejomi: 請問一下 check_f如果傳入Type有找到,為啥會優先走help 10/24 21:56
lovejomi: er為參數的版本?是什麼規則嗎 10/24 21:56
lovejomi: 另外一開始的f存在意義是什麼?感覺可以拿掉? 10/24 21:57
PkmX: variadic argument在overload的rank最低 10/25 10:07
PkmX: 如果helper<...>沒有因為SFINAE被剃除的話 就會優先選擇它 10/25 10:07
PkmX: f存在是舉例用避免undeclared identifier 10/25 10:08
PkmX: loveflames: 突然想到你可以用weak function去判斷吧 10/25 10:09