【问题标题】:How is a pointer to a member function different than a pointer to a data member?指向成员函数的指针与指向数据成员的指针有何不同?
【发布时间】:2023-03-27 08:23:01
【问题描述】:

所以我有这个别名模板:

template<class MemberT, class ClassT>
using make_member_ptr = MemberT ClassT::*;

我注意到make_member_ptr&lt;int(char, long), class_type&gt;int(class_type::*)(char, long) 相同。之前我一直在想,指向成员函数的指针和指向数据成员的指针是完全不同的。

指向成员函数的指针与指向数据成员的指针有何不同?

我唯一能找到的是,如果成员函数是虚函数,则通过指向基函数的指针调用将调用派生函数,这对于非函数成员的指针来说不是问题。

我问的原因是我正在处理指向成员的通用指针,我想知道我必须注意什么以及指向成员函数与数据成员的指针的特殊情况。

【问题讨论】:

  • 为什么你认为它们是一样的? MemberT ClassT::* 在语法上甚至与 MemberT (ClassT::*)() 不同。
  • @WernerHenze 这里就像using MemberT = int()std::is_same_v&lt;make_member_ptr&lt;int(), class_type&gt;, int(class_type::*)()&gt; 是真的。
  • @Artyer 它们就像指向普通函数的指针和指向普通对象的指针一样不同。
  • @WernerHenze 嗯,它有点……它看起来不是因为 C 的深奥螺旋规则,用于围绕名称分布类型的各个方面(在这里,它是零-长度)
  • 函数指针的大小可以不同于数据指针的大小。成员函数可以是虚拟的,而数据成员只能通过使用虚拟继承(实际上是合并,而不是多态)来实现。

标签: c++ pointer-to-member


【解决方案1】:

之前,我认为指向成员函数的指针与指向数据成员的指针完全不同。

你想的没错。

指向成员函数的指针与指向数据成员的指针有何不同?

它们是不同的类型。它们可能有不同的尺寸。指向成员函数的指针可以指向成员函数。指向数据成员的指针可以指向数据成员。区别类似于函数指针和数据指针的区别。

make_member_ptr&lt;int(char, long), class_type&gt; 是一个指向成员函数的指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多