Fajną rzeczą w C++ jest to, że pozwala tworzyć zmienne typu wskaźnik-do-członka. Najczęstszym przypadkiem użycia wydaje się aby uzyskać wskaźnik do metody:Co to jest `int foo :: * bar :: *`?
struct foo
{
int x() { return 5; }
};
int (foo::*ptr)() = &foo::x;
foo myFoo;
cout << (myFoo.*ptr)() << '\n'; // prints "5"
Jednak aprowizacji, zdałem sobie sprawę, że mogą one równie dobrze wskazywać zmiennych składowych:
struct foo
{
int y;
};
int foo::*ptr = &foo::y;
foo myFoo;
myFoo.*ptr = 5;
cout << myFoo.y << '\n'; // prints "5"
Jest całkiem rad. Doprowadziło mnie to do kolejnego eksperymentu: co by było, gdyby uzyskać wskaźnik do pod-członka struktury? To jest .
Jednak nie mam pojęcia, jak przypisać to coś użytecznego. Żadna z następujących robót:
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::*'
Ponadto, w zależności od błędu, który to generuje, wydaje się, że tego typu nie jest dokładnie to, co mam na myśli:
int bar::*foo::*ptr = nullptr;
bar myBar;
myBar.*ptr = 4; // pointer to member type ‘int bar::*’ incompatible
// with object type ‘bar’
Wydaje się, że koncepcja ta uchyla mnie. Oczywiście nie mogę wykluczyć, że zostanie on po prostu sparsowany w sposób całkowicie odmienny od tego, czego bym się spodziewał.
Czy ktoś mógłby mi wyjaśnić, czym właściwie jest int bar::*foo::*
? Dlaczego gcc informuje mnie, że wskaźnik do elementu bar
jest niezgodny z obiektem bar
? Jak korzystać z int bar::*foo::*
i jak mam utworzyć prawidłową?
Wygląda to na okrężną próbę określenia, co 'decltype()' z odpowiednimi szablonami już dostarcza? – slashmais
Może nie wiem wystarczająco dużo na ten temat, ale jeśli to pomaga, 'int bar :: * foo :: * ptr = * nowy decltype (ptr);' kompiluje, ale nie wiem co robi i ja nie może nic zrobić z wynikiem. To także wyciek pamięci, ale czasami pamięć musi być poświęcana w imię nauki. – IllusiveBrian
Geez, kiedy twórcy kompilacji zaimplementowali to, przysięgam, że przysięgali dużo o tym, kto to kiedykolwiek użyje. – marczellm