[英]Removing class pointer from member function pointer type
我在stpp :: is_function的cppreference示例中看到了这段代码片段,我不明白它是如何工作的。 有人可以向我解释为什么U会在PM_traits中被推断出来吗?
struct A {
int fun() const&;
};
template<typename>
struct PM_traits {};
template<class T, class U>
struct PM_traits<U T::*> {
using member_type = U;
};
int main() {
using T = PM_traits<decltype(&A::fun)>::member_type; // T is int() const&
}
UT::*
是一种类型,当我们有UT::* p
, p
指向类T
的成员,该成员的类型为U
fun
是int () const &
类型的int () const &
:一个const &
-qualified函数,不带参数并返回int
,它是A
类的成员。 因此,在推论中, T
推导为A
, U
推导为A::fun
的类型,即int () const &
。
它可能看起来有点令人困惑,因为如果显式拼写出&A::fun
的类型,则必须写入int (A::*)() const &
。 但是,在模板的情况下,类型int () const &
在名称U
后面是“隐藏”,因此指向成员的指针只是UA::*
。 它类似于如何使用类型名称来简化普通函数指针的语法:
int foo(char, double) { return 42; }
using Fun = int (char, double);
Fun *p = &foo;
// instead of:
int (*q)(char, double) = &foo;
模板中也是如此,只需使用A::*
而不是*
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.