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从未提及后者