C++ C::*作为模板类型C的参数——这是什么语法?
以这一行为例:C++ C::*作为模板类型C的参数——这是什么语法?,c++,syntax,function-pointers,sfinae,C++,Syntax,Function Pointers,Sfinae,以这一行为例: template <typename C> static yes& test(reallyHas<std::string (C::*)(), &C::serialize>*) { } template static yes&test(reallyHas*){} 我在一篇关于SFINAE的文章中找到了它。我很难理解这句话。行上方的注释是“std::string(C::*)()是函数指针声明。” 我知道函数指针是这样的参数: void fo
template <typename C> static yes& test(reallyHas<std::string (C::*)(), &C::serialize>*) { }
template static yes&test(reallyHas*){}
我在一篇关于SFINAE的文章中找到了它。我很难理解这句话。行上方的注释是“std::string(C::*)()
是函数指针声明。”
我知道函数指针是这样的参数:
void foo(bar(fptr*)(cat c,meow m)){}
但是
:
在那里做什么C
是一种类型,与fptr
位于相同的语法位置。但是fptr
是实体的名称(指向作为参数传递的函数的指针),所以。。。这些函数如何精确对应?查找“指向非静态类成员函数的指针”。这些类型的函数在C
中不存在。你说这些函数在C
中不存在是什么意思?我查了一下,但还是不明白这里发生了什么。::*
是一个原子表达式吗?还是由::
和*
组成?如果是这样的话,为什么*
?@lotolmencre::*
实际上是两个顺序的令牌(:
,然后*
),这与使用指针时的*
或->*
不同,它们是单个令牌。比较:裸函数指针(void(*fp)(int arg)
)与成员函数指针(void(T:*mfp)(int arg)
)。请注意,您在最后的代码示例中切换了*
和标识符。如果不再提及标识符,例如在转发声明中,则可以省略该标识符。@PaulMcKenzie您似乎将类名C
与编程语言C混在一起了。OP从未提及最近的查找指向非静态类成员函数的指针"这些类型的函数在C
中不存在。你说这些函数在C
中不存在是什么意思?我查了一下,但仍然不明白这里发生了什么。:*
是原子表达式吗?还是它是由:
和*
组成的?如果是,为什么*
?@lotolmencre:::*
实际上是原子表达式两个按顺序排列的标记(::
然后*
),与使用指针时的*
或->*
不同,指针是单个标记。比较:裸函数指针(void(*fp)(int-arg)
)与成员函数指针(void(T:*mfp)(int-arg)
)。请注意,您在最后的代码示例中切换了*
和标识符。如果不再提及标识符,例如在转发声明中,则可以省略该标识符。@PaulMcKenzie您似乎将类名C
与编程语言C混淆了。OP从未提及后者