[心得] 编译时确定函数有无宣告

楼主: 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