Я отлаживал некоторый код, включающий указатели на поля-члены, и решил распечатать их, чтобы увидеть их значения. У меня была функция, возвращающая указатель на член:
#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
(то есть 1
равно y
и 0
равно x
), но нет, напечатанное значение на самом деле 1
для не нулевой указатель и 0
для нулевого указателя. Я предполагаю, что это стандартно-совместимое поведение (хотя это и не полезно) - я прав? Кроме того, может ли совместимая реализация C ++ всегда печатать 0
для указателей на члены? Или даже пустая строка?
И, наконец, как я могу напечатать указатель на член осмысленным образом? Я придумал два уродливых способа:
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!
Есть ли лучшие способы?