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

作者: loveflames (咕啾咕啾魔法陣)   2017-10-24 10:19:53
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成員
作者: PkmX (阿貓)   2017-10-24 20:58:00
比較精確的說應該是你要判斷函數有沒有你想要的overload吧
作者: kingofsdtw (不能閒下來!!)   2017-10-24 21:00:00
cout ?
作者: PkmX (阿貓)   2017-10-24 21:01:00
C++17 + std::is_detected TShttp://coliru.stacked-crooked.com/a/4d2a330955c69554用 C++20 concepts (目前gcc實做的語法和最終有點差異)http://coliru.stacked-crooked.com/a/6811f025597528e9
作者: loveflames (咕啾咕啾魔法陣)   2017-10-24 21:20:00
我很想知道有沒有辦法確認函數有無定義,卻又能編譯通過的方式目前我只知道constexpr函數特定情況下能用noexcept判斷
作者: PkmX (阿貓)   2017-10-24 21:51:00
定義可能是在別的translation unit裡面 除非到link時才知道
作者: lovejomi (JOMI)   2017-10-24 21:56:00
請問一下 check_f如果傳入Type有找到,為啥會優先走helper為參數的版本?是什麼規則嗎另外一開始的f存在意義是什麼?感覺可以拿掉?
作者: PkmX (阿貓)   2017-10-25 10:07:00
variadic argument在overload的rank最低如果helper<...>沒有因為SFINAE被剃除的話 就會優先選擇它f存在是舉例用避免undeclared identifierloveflames: 突然想到你可以用weak function去判斷吧

Links booklink

Contact Us: admin [ a t ] ucptt.com