C++ std中的模板类型是\u成员\u函数\u指针

C++ std中的模板类型是\u成员\u函数\u指针,c++,c++11,c++14,C++,C++11,C++14,我指的是std::is\u member\u function\u pointer的可能实现 模板 结构是\成员\函数\指针\助手:std::false \类型{}; 模板 struct is_member_function_pointer_helper:std::is_function{}; 模板 结构是成员函数指针:是成员函数指针助手 #包括 甲级{ 公众: 无效成员(){} }; int main() { //如果::成员是数据成员而不是函数,则在编译时失败 静态断言(std::is_成员

我指的是
std::is\u member\u function\u pointer
的可能实现

模板
结构是\成员\函数\指针\助手:std::false \类型{};
模板
struct is_member_function_pointer_helper:std::is_function{};
模板
结构是成员函数指针:是成员函数指针助手
#包括
甲级{
公众:
无效成员(){}
};
int main()
{
//如果::成员是数据成员而不是函数,则在编译时失败
静态断言(std::is_成员_函数_指针::值,
“A::member不是成员函数。”);
}
我知道

“dectype(&A::成员)”

将是

“无效(A::*)()”

但是我不明白在“void(A::*)()”中T型和U型映射到什么?

template
struct is_member_function_pointer_helper:std::is_function{};
如果可以将主模板参数分解为类类型
U
和非静态成员类型
T
,则上述专门化将是匹配的。类类型
U
在这里不再有用,因为我们已经确认,它实际上是一个类

然后将非静态成员类型
T
作为模板参数传递给
std::is_function
,该函数在确定
T
确实是一个函数时有很多机制


但是我不明白
T
U
void中映射到什么类型
(A::*)()

如上所述,一旦我们能够分解
void(A::*)()
以匹配
tu:*
,您将发现
A:*
映射到
U:*
。让我们移除这个模式,剩下的是
void()
,这就是
T
将要成为的。

模式
void(A:*)()
分解为
tu:*
其中
U
A
T
void()
。 您可以看到反向构造,如下所示:

struct A {};

using T = void ();
using U = A;

template <typename> struct print;

int main() {
    print<T U::*>{};
    // error: implicit instantiation of undefined template 'print<void (A::*)()>'
}
struct A{};
使用T=void();
使用U=A;
模板结构打印;
int main(){
打印{};
//错误:未定义模板“打印”的隐式实例化
}
因此,
T
as
void()
被传递给
std::is_function
,该函数确定给定类型是否为函数类型


在指针指向数据成员的情况下,这会失败,因为导出的
T
将是一个非函数类型。

我认为如果我们首先将类型id翻译成英语,那么更容易理解。也就是说,
void(A::*)()
被翻译成“指向类成员的指针
A
,类型为()函数,返回
void
”,而
tu:*
被翻译成“指向
T
类型的类成员的指针”。现在,如果我们比较这两种类型,我们可以看到
U
对应于类
A
T
对应于“函数()返回
void
”,即
void()
,抱歉,现在修复了它。
template< class T, class U>
struct is_member_function_pointer_helper<T U::*> : std::is_function<T> {};
struct A {};

using T = void ();
using U = A;

template <typename> struct print;

int main() {
    print<T U::*>{};
    // error: implicit instantiation of undefined template 'print<void (A::*)()>'
}