开发平台(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 何者编译成功
谢谢大大们看完此篇文章