メンバ フィールドへのポインタを含むいくつかのコードをデバッグしていたので、値を確認するためにそれらを出力することにしました。メンバーへのポインターを返す関数がありました。
#include <stdio.h>
struct test {int x, y, z;};
typedef int test::*ptr_to_member;
ptr_to_member select(int what)
{
switch (what) {
case 0: return &test::x;
case 1: return &test::y;
case 2: return &test::z;
default: return NULL;
}
}
私は使用してみましたcout
:
#include <iostream>
int main()
{
std::cout << select(0) << " and " << select(3) << '\n';
}
私は得1 and 0
た。struct
数字は(つまり is1
とy
is 0
)内のフィールドの位置を示していると思っていましたx
が、実際には出力された値は1
非 null ポインターと0
null ポインター用です。これは標準に準拠した動作だと思います (役に立ちませんが) - そうですか? さらに、準拠した C++ 実装が常に0
メンバーへのポインターを出力することは可能ですか? それとも空の文字列ですか?
最後に、意味のある方法でメンバーへのポインターを出力するにはどうすればよいですか? 私は2つの醜い方法を思いつきました:
printf("%d and %d\n", select(0), select(3)); // not 64-bit-compatible, i guess?
ptr_to_member temp1 = select(0); // have to declare temporary variables
ptr_to_member temp2 = select(3);
std::cout << *(int*)&temp1 << " and " << *(int*)&temp2 << '\n'; // UGLY!
より良い方法はありますか?