我在std :: 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&
}
答案 0 :(得分:11)
U T::*
是这样的类型,当我们有U T::* p
时,p
指向类T
的成员,而该成员的类型为U
fun
是类型int () const &
的函数:一个const &
限定的函数,不带参数,返回int
,并且是类A
的成员。因此,在推论中,将T
推导为A
,将U
推导为A::fun
的类型,即int () const &
。
这可能看起来有些混乱,因为如果&A::fun
的类型被明确拼写,则必须将其写成int (A::*)() const &
。但是,在模板的情况下,类型int () const &
被隐藏在名称U
的后面,因此指向成员的指针就是U A::*
。类似于如何使用类型名称来简化普通函数指针的语法:
int foo(char, double) { return 42; }
using Fun = int (char, double);
Fun *p = &foo;
// instead of:
int (*q)(char, double) = &foo;
模板中也是如此,只是使用A::*
而不是*
。