【发布时间】:2023-03-27 08:23:01
【问题描述】:
所以我有这个别名模板:
template<class MemberT, class ClassT>
using make_member_ptr = MemberT ClassT::*;
我注意到make_member_ptr<int(char, long), class_type> 与int(class_type::*)(char, long) 相同。之前我一直在想,指向成员函数的指针和指向数据成员的指针是完全不同的。
指向成员函数的指针与指向数据成员的指针有何不同?
我唯一能找到的是,如果成员函数是虚函数,则通过指向基函数的指针调用将调用派生函数,这对于非函数成员的指针来说不是问题。
我问的原因是我正在处理指向成员的通用指针,我想知道我必须注意什么以及指向成员函数与数据成员的指针的特殊情况。
【问题讨论】:
-
为什么你认为它们是一样的?
MemberT ClassT::*在语法上甚至与MemberT (ClassT::*)()不同。 -
@WernerHenze 这里就像
using MemberT = int(),std::is_same_v<make_member_ptr<int(), class_type>, int(class_type::*)()>是真的。 -
@Artyer 它们就像指向普通函数的指针和指向普通对象的指针一样不同。
-
@WernerHenze 嗯,它有点……它看起来不是因为 C 的深奥螺旋规则,用于围绕名称分布类型的各个方面(在这里,它是零-长度)
-
函数指针的大小可以不同于数据指针的大小。成员函数可以是虚拟的,而数据成员只能通过使用虚拟继承(实际上是合并,而不是多态)来实现。
标签: c++ pointer-to-member