[问题] C++ template 确定函式是否存在

楼主: mikukonn (mikukon)   2018-12-02 21:26:42
开发平台(Platform): (Ex: Win10, Linux, ...)
Visual Studio 2018
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
VC++
问题
1.
decltype(&C::helloworld) 的型别是不是为 void (has_helloworld_class::*)()
2. 为何
typename C::helloworld* 无法通过编译
以下正文
因为最近对如果在C++ template中想要因所拥有的成员函数不同而有不同行为的话该如何使用
这边是我上网查到的code,其实我也不是很清楚是如何运作的
https://ideone.com/wNyohz
小弟在这里试试看解读以上的code
因为C++的 SFINAE 所以会从 test 中找到最适合的一个 template
当 has_helloworld_class 被带入时,因为有 helloworld 函数,
所以第一个 test 函数是最好的函数而被判断返回值,
依照返回值的大小来判断哪个 test function 被评估
不过这里我不太懂 decltype(&C::helloworld) 是什么型别,这跟
void (has_helloworld_class::*)()
是一样的型别吗?
当我在 Wekipedia 搜寻相关资料时,跑了遗下他们的范例结果发现无法编译成功
https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error#Example
这里的程式码我看得懂,也就是但是不知为何
template <typename C>
static yes& test(typename C::foobar*);
此句一直编译失败,Wekipedia 上面的范例就是传入 nullptr,并评估两个 test function 何者编译成功
谢谢大大们看完此篇文章
作者: AstralBrain   2018-12-02 21:54:00
1. 对2. 可以啊 https://ideone.com/JqDpHV
作者: loveme00835 (发箍)   2018-12-02 23:04:00
因为 line 11 的 C::helloworld 是跟 C 要 membertype, 跟 member function 无关https://ideone.com/AQueNd你看的这份 code 有两个比较麻烦的地方: 第一个就是在 class template 里面写 function template, 这是为了避免在具现化类别实体的时候直接因为没有成员函式而报错, 所以用模版延迟 test 的具现化. 第二点是因为 resolve 合适函式呼叫时, 多载优先权会比模版还高, 所以你把 test(...) 的 template 拿掉就可以看到怎样回传都是 0
楼主: mikukonn (mikukon)   2018-12-02 23:44:00
那为何放上 &C::helloworld 就可以运作呢应该说,判断这个是取成员函数或成员函式的基准在哪里呢
作者: loveme00835 (发箍)   2018-12-02 23:47:00
你在 Ad4UdD 那个连结里写的 typename 就是在跟编译器讲后面的 qualified name 要当成型别来看, 不然没加都是当成资料成员/成员函式, 不过用 :: 来取的资料只有 static data member^ 更正: 以这个使用情境来说把 class template 拿掉一样可以理解 SFINAEhttps://ideone.com/ZrAFBz
楼主: mikukonn (mikukon)   2018-12-02 23:57:00
如果不加typename会编译错误,应该编译器这时候判断无法使用此函式应该会跳到 test(...)尝试编译吧请问我这样理解有不对的地方吗另外我有找到这种奇妙的判断方式XDhttps://ideone.com/sOzY23
作者: loveme00835 (发箍)   2018-12-03 00:19:00
你的用法有需要解决的问题, 参考 std::declval问题就是在于当在模版里面的时候, 你给编译器一个qualified name, 有没有加 typename 行为是不一样的你没加 typename 的时候, 就跟这个例子很像https://ideone.com/RKPwtB 这个还没有到 resolve 阶段就被当作错误排除掉SFINAE 的 S 指的不是编译, 你再仔细看维基叙述
楼主: mikukonn (mikukon)   2018-12-03 00:29:00
原来如此,谢谢大大花时间帮我解决疑惑
作者: loveme00835 (发箍)   2018-12-03 00:43:00
可以参考这里 https://bit.ly/2BMqgbu

Links booklink

Contact Us: admin [ a t ] ucptt.com