我指的是std::is_member_function_pointer
here的可能实现。
template< class T >
struct is_member_function_pointer_helper : std::false_type {};
template< class T, class U>
struct is_member_function_pointer_helper<T U::*> : std::is_function<T> {};
template< class T >
struct is_member_function_pointer : is_member_function_pointer_helper< std::remove_cv_t<T> >
#include <type_traits>
class A {
public:
void member() { }
};
int main()
{
// fails at compile time if A::member is a data member and not a function
static_assert(std::is_member_function_pointer<decltype(&A::member)>::value,
"A::member is not a member function.");
}
我知道
“dectype(安培; A ::构件)”
将是
“void(A :: *)()”
但我不明白什么类型的T和U型映射到“void(A :: *)()”?
答案 0 :(得分:6)
模式T U::*
分解为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::*)()>'
}
。
您可以反向查看构造,如下所示:
T
因此void ()
为std::is_function
传递给T
,确定给定类型是否为函数类型。
在指向数据成员的指针的情况下,这会失败,因为推导的{{1}}将是非函数类型。
答案 1 :(得分:4)
template< class T, class U>
struct is_member_function_pointer_helper<T U::*> : std::is_function<T> {};
如果可以将主模板参数分解为类类型 U
和非静态成员类型 T
。 类类型 U
在这里不再有用,因为我们已经确认,它确实是一个类。
然后将非静态成员类型 T
作为模板参数传递给std::is_function
,T
在确定T
时有很多机制确实是一种功能。
但我不明白
U
中的void (A::*)()
类型和void (A::*)()
的地图类型?
如上所述,一旦我们能够将T U::*
分解为匹配A::*
,您就会发现U::*
映射到void ()
。让我们删除该模式,我们留下T
CharAdapter
。
答案 2 :(得分:2)
如果我们首先将type-id翻译成英语,我认为这更容易理解。也就是说,void (A::*)()
被转换为&#34;指向函数类型A
的成员的指针,返回void
&#34;和T U::*
到&#34;指向类U
&#34;的类T
成员的指针。现在,如果我们比较两种类型,我们可以看到U
对应于类A
而T
对应于&#34;函数()返回void
&#34; ,即void()
。