作者loveflames (咕啾咕啾魔法阵)
看板C_and_CPP
标题[心得] 编译时确定函数有无宣告
时间Tue Oct 24 10:19:53 2017
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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1508811595.A.088.html
※ 编辑: loveflames (36.236.68.9), 10/24/2017 10:38:19
1F:→ PkmX: 比较精确的说应该是你要判断函数有没有你想要的overload吧 10/24 20:58
2F:→ kingofsdtw: cout ? 10/24 21:00
3F:→ PkmX: C++17 + std::is_detected TS 10/24 21:01
5F:→ PkmX: 用 C++20 concepts (目前gcc实做的语法和最终有点差异) 10/24 21:02
7F:→ loveflames: 我很想知道有没有办法确认函数有无定义,却又能编译通 10/24 21:20
8F:→ loveflames: 过的方式 10/24 21:20
9F:→ loveflames: 目前我只知道constexpr函数特定情况下能用noexcept判 10/24 21:21
10F:→ loveflames: 断 10/24 21:21
11F:→ PkmX: 定义可能是在别的translation unit里面 除非到link时才知道 10/24 21:51
12F:推 lovejomi: 请问一下 check_f如果传入Type有找到,为啥会优先走help 10/24 21:56
13F:→ lovejomi: er为参数的版本?是什麽规则吗 10/24 21:56
14F:→ lovejomi: 另外一开始的f存在意义是什麽?感觉可以拿掉? 10/24 21:57
15F:→ PkmX: variadic argument在overload的rank最低 10/25 10:07
16F:→ PkmX: 如果helper<...>没有因为SFINAE被剃除的话 就会优先选择它 10/25 10:07
17F:→ PkmX: f存在是举例用避免undeclared identifier 10/25 10:08
18F:→ PkmX: loveflames: 突然想到你可以用weak function去判断吧 10/25 10:09