5

二項演算子を使用してポインタをメンバーと比較できない理由について混乱しました<

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

6 に答える 6

2

オブジェクトのメンバーのアドレスを比較できます。

A a;
if (std::less<void*>()(&a.a, &a.b))
    std::cout << "a precedes b\n";
else
    std::cout << "a follows b\n";
于 2012-10-25T14:26:31.613 に答える
1

同じ理由で、一般的にポインタを比較することはできません。サポートされている順序の唯一の比較は、2つのデータポインターが同じ配列を指している場合です。それ以外の場合、比較の結果は指定されていません。コンパイラーは、オペレーターを合理的な方法で「機能」させる必要はありません。(ここで全順序を確保するには、一部のアーキテクチャーで追加の計算が必要になります。)メンバーへのポインターに対して指定された結果を取得できるケースがないため、標準では演算子への引数としてそれらを許可していません。

全順序付けが必要な場合は、std::less他。それを提供することが保証されています。含めて、私が標準を正しく理解していれば、メンバーポインタ。(メンバー関数へのポインターの全順序付けを提供すると、おそらく非常にコストがかかります。)ただし、それでも、この順序付けは任意である可能性があります。順序をメモリに反映する必要はありません。

于 2012-10-25T10:16:21.603 に答える
0

Point3dがオーバーロードする場合<次に、それらを尊重して比較を行います。

* mem1 <* mem2を返しますか?"メンバー1が最初に発生します":"メンバー2が最初に発生します";

または署名を変更します

char * access_order(data_type1 class_type ::&mem1、data_type2 class_type ::&mem2)char * access_order(data_type1 class_type :: mem1、data_type2 class_type :: mem2)

実際のメモリアドレスで比較しますか?

于 2012-10-25T09:55:28.773 に答える
0

メンバーへのポインタは、一部のメモリ自体を指していません。それらは単なるラベルです。それらを使用してできる唯一のことは、演算子を使用して指定されたオブジェクトのポインティー値を参照するように変換する.*->*、メンバー変数への別のポインターに格納することです。

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

int & realPointer = a.*p2m;

同じ型のポインターのみを比較できるため、 ( ) へのポインターと ( ) へのA::aポインターを比較できないことに注意してください。int A::*A::bfloat A::*

于 2012-10-25T11:00:39.067 に答える
0

ポインタ比較は誰もが興味をそそられるように見えますが、常に移植性のない、または未定義の動作につながります。

最も簡単な答えは、決してこれを行うべきではないということです。古典的なアプローチで解決できない計算問題はありません。

誤解しないでいただきたいのですが、間違った質問をすると興味深い考えが浮かんだり、言語や CPU のしくみについての理解が深まる可能性があることは承知しています。

于 2021-12-24T15:21:36.987 に答える