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
asvoid()
被传递给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::*)()>'
}