比较指向成员的指针?

时间:2012-10-25 09:47:28

标签: c++

我很困惑为什么无法使用二元运算符<比较指向成员的指针?

class Point3d{
  protected:
      //..
 public:
     float x;
      static list<Point3d*> *freeList;
 public:
     float y;
     static const int chunkSize = 250;
 public:
    float z;

};
和模板:

template< class class_type, class data_type1, class data_type2 >

char* access_order(data_type1 class_type:: *mem1, data_type2 class_type:: *mem2)
{

    return
      mem1 < mem2 ?
         "member 1 accurs first":
         "member 2 accurs first";
}  

当我调用access_order时如下:

access_order(&Point3d::z, &Point3d::y);

g ++报道:

"invalid operands of types ‘float Point3d::*’ and ‘float Point3d::*’ to binary ‘operator<’"

有没有办法比较指向成员的指针,我的意思是不平等的比较,以及如何?

4 个答案:

答案 0 :(得分:1)

出于同样的原因,你无法比较一般的指针。唯一的 如果两个数据指针指向,则支持的顺序比较 进入同一个数组。否则,比较的结果是 不明;不需要编译器使运算符“工作” 任何合理的方式。 (确保这里的总订单需要额外的 计算某些架构。)因为没有案例你可以得到 指向成员的指针的结果,标准不允许 它们作为运营商的参数。

如果您需要总排序,std::less等。保证提供 它。包括,如果我正确理解标准,成员指针。 (尽管提供指向成员函数的指针的总排序 可能会非常昂贵。)然而,即使这样,这个顺序 可能是任意的;它肯定不需要反映任何 在内存中排序。

答案 1 :(得分:1)

您可以比较对象成员的地址

A a;
if (std::less<void*>()(&a.a, &a.b))
    std::cout << "a precedes b\n";
else
    std::cout << "a follows b\n";

答案 2 :(得分:0)

如果Point3d重载&lt;然后尊重他们并进行比较,

返回       * mem1&lt; * mem2?          “会员1先诅咒”:          “成员2诅咒第一”;

或更改签名

char * access_order(data_type1 class_type ::&amp; mem1,data_type2 class_type ::&amp; mem2) char * access_order(data_type1 class_type :: mem1,data_type2 class_type :: mem2)

您想要对实际内存地址进行比较吗?

答案 3 :(得分:0)

指向成员的指针本身并不指向某些记忆。它们只是标签。你可以用它们做的唯一事情就是用操作符.*->*将它们转换为对给定对象的pointee值的引用,或者存储在另一个指向成员变量的指针中。

struct A
{
    int a;
    float b;
};
A a;
int A::* p2m = &A::a;
int A::* p2m2 = p2m;

int & realPointer = a.*p2m;

注意,您只能比较相同类型的指针,因此您无法将指向A::aint A::*)的指针与指向A::b的指针进行比较(float A::*