gpt4 book ai didi

c++ - 从成员函数指针类型中删除类指针

转载 作者:可可西里 更新时间:2023-11-01 18:26:08 29 4
gpt4 key购买 nike

我在 std::is_function 的 cppreference 示例中看到了这段代码片段,但我不明白它是如何工作的。有人可以向我解释为什么像在 PM_traits 中那样推导出 U 吗?

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&
}

最佳答案

U T::* 是这样一种类型,当我们有 U T::* p 时,p 指向类 T,并且该成员的类型为 U

funint () const & 类型的函数:一个 const & 限定的函数,不带参数并返回 int,它是 A 类的成员。因此在推导中,T被推导为AU被推导为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::* 而不是 *

关于c++ - 从成员函数指针类型中删除类指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56709483/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com