Отличительной особенностью C++ является то, что он позволяет создавать переменные типа указатель на член. Наиболее распространенным вариантом использования, по-видимому, является получение указателя на метод:
struct foo
{
int x() { return 5; }
};
int (foo::*ptr)() = &foo::x;
foo myFoo;
cout << (myFoo.*ptr)() << '\n'; // prints "5"
Однако, повозившись, я понял, что они могут точно так же указывать на переменные-члены:
struct foo
{
int y;
};
int foo::*ptr = &foo::y;
foo myFoo;
myFoo.*ptr = 5;
cout << myFoo.y << '\n'; // prints "5"
Это довольно круто. Это привело меня к следующему эксперименту: что, если бы вы могли получить указатель на подчлен структуры?
struct foo
{
int y;
};
struct bar
{
foo aFoo;
};
int bar::*foo::*ptr;
Этот фактически компилируется.
Однако я понятия не имею, как назначить ему что-нибудь полезное. Ни одна из следующих работ:
int bar::*foo::*ptr = &bar::foo::y; // no member named "foo" in "bar"
int bar::*foo::*ptr = &bar::aFoo::y; // no member named "aFoo" in "bar" (??)
int bar::*foo::*ptr = &foo::y; // can't init 'int bar::*foo::*' with 'int foo::*'
Кроме того, в соответствии с ошибкой, которую это генерирует, кажется, что этот тип не совсем то, что я имею в виду:
int bar::*foo::*ptr = nullptr;
bar myBar;
myBar.*ptr = 4; // pointer to member type ‘int bar::*’ incompatible
// with object type ‘bar’
Кажется, эта концепция ускользает от меня. Очевидно, я не могу исключить, что он просто анализируется способом, совершенно отличным от того, что я ожидал.
Кто-нибудь, пожалуйста, объясните мне, что такое int bar::*foo::*
на самом деле? Почему gcc сообщает мне, что указатель на элемент bar
несовместим с объектом bar
? Как бы я использовал int bar::*foo::*
и как бы я построил правильный?
decltype()
с соответствующими шаблонами уже доставляет? - person slashmais   schedule 05.10.2014int bar::*foo::*ptr = *new decltype(ptr);
компилируется, но я не знаю, что он делает, и ничего не могу сделать с результатом. Это тоже утечка памяти, но иногда памятью приходится жертвовать во имя науки. - person IllusiveBrian   schedule 05.10.2014