分配"指向成员的指针"自我

时间:2016-11-22 14:56:44

标签: c++ self pointer-to-member

有没有办法分配指向类成员的指针,以便它指向类本身?

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

例如:

struct SFoo {};

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

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

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

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

1 个答案:

答案 0 :(得分:1)

不幸的是,问题不是很清楚(但-1不是我的)。我的印象是,您要混淆要排序的对象的类型(在您的情况下,这是SFoo),以及排序键的类型。在典型的情况下,他们是不同的。例如:要排序的用户(对象)和排序键是第一个和最后一个名称(一对字符串)。您没有直接说明排序键的类型。

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

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

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

成员指向成员的指针。该对象不是其成员。这是C ++定义的好坏。

您可能会尝试定义包装类,例如:

struct SFoo2
{
    SFoo m_data_field;
};

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