将 "pointer-to-member" 分配给自己

assigning a "pointer-to-member" to self

有什么方法可以分配指向 class 成员的指针,使其指向 class 本身?

这实际上意味着将成员指针应用于 class 的实例的结果将是对同一实例的引用。

例如:

struct SFoo {};

constexpr SFoo SFoo::* MP_foo = &SFoo:: MYSELF;
// Is there some syntax I can use here? --^

我想要这个的原因是我有一个排序算法,适用于任意模板类型的元素容器。使用提供的指向成员的指针从每个元素获得排序键。

但是,我现在希望对元素是也是键的容器进行排序。因此,我需要使成员指针指向自身(就好像 class 是它自己的成员)。

我可以使用许多简单(零成本)的技巧(我现在正在使用一个),但我想知道是否有一些语法技巧可以用来完成它 正确的方式-避免额外的不优雅代码。

不幸的是问题不是很清楚(但-1不是我的)。我的印象是你混淆了要排序的对象的类型(在你的例子中是 SFoo),以及排序键的类型。在典型情况下,它们是不同的。例:待排序的用户(对象),排序键为名字和姓氏(一对字符串)。您没有直接说明排序键的类型。

语法上SFoo SFoo::* MP_foo是指向类型为SFoo的实例字段的指针。 C++ 不允许这样做,否则会导致无限递归。该字段将有 SFoo 归档,并且该内部字段将需要再次具有该字段。

其次,您正在尝试使用指向函数的指针来初始化指向数据的指针。构造函数 SFoo::SFoo 是一个函数。而且正如评论中提到的,不允许使用ctors的地址。

再尝试一次:将成员指针应用于 class 的实例将是对同一实例的引用。

指向成员的指针指向一个成员。该对象不是其成员。好或坏这就是 C++ 的定义方式。

您可以尝试定义包装器 class,例如:

struct SFoo2
{
    SFoo m_data_field;
};

请注意,从内存布局的角度来看,它们是相同的。 SFoo2 可以有指向类型 SFoo 的成员的指针。我不确定这是否适用于您的上下文,但您可以试一试。