Går det att skapa en pekare till en medlem i en nästlad struktur? Lite svårt att förstå vad du är ute efter. Man kan inte skapa en generell pekare till en medlem i strukturen. Däremot kan du: <b>Man kan inte skapa en generell pekare till en medlem i strukturen.</b> Anledningen till att jag vill göra det är att jag har generella predikat som "equal_member" vilka tar en medlemspekare som argument. Använder predikaten med algoritmerPekare till nästlad medlem
<code=c++>
struct yttre {
struct inre {
int medlem;
} x, y;
};
</code>
Jag vill nu ha en pekare till yttre::x.medlem.
Nåt i stil med
<code=c++>
int yttre::inre::* p = &yttre::x.medlem;
yttre y;
y.*p = 2;
</code>Sv: Pekare till nästlad medlem
1. Skapa en pekare till medlemmen i en specifik struktur.
<code=c++>
yttre y;
int* p = &y.x.medlem;
</code>
2. Lägga till en konsturerare och en pekare i stukturen så varje instans har en pekare till den inre medlemmen, varför man nu skulle vilja göra så.
<code=c++>
struct yttre {
yttre() { p = &x.medlem; }
struct inre {
int medlem;
} x, y;
int *p;
};
// Sedan är det bara att
yttre y;
*y.p = 2;
</code>
/PeterSv:Pekare till nästlad medlem
Jodå, man kan skapa en generell pekare till en medlem i en struktur. I princip är det den relativa adressen för medlemmen gentemot strukturens början.
Följande kod skapar en pekare till medlemmen y i strukturen yttre:
yttre::inre yttre::*p = & yttre::y;
yttre::inre anger att p pekar på typen (strukturen) inre som ligger i yttre.
yttre::* anger att pekaren gäller relativt yttre.
Pekaren används så här:
yttre z;
(z.*p).medlem = 123;
Här är z.*p detsamma som z.y eftersom p pekar på y.
Vad Martin vill göra är att på motsvarande sätt skapa en pekare q till x.medlem relativt yttre, så att man z.*q blir detsamma som z.x.medlem.
Jag har försökt, men lyckades inte få till det.
Sv: Pekare till nästlad medlem
<code=c++>
if (std::find_if(vec.begin(), vec.end(), equal_member(&yttre::member, 2)) != vec.end()) {
...
}
std::sort(vec.begin(), vec.end(), less_member(&yttre::member));
sum = accumulate(vec.begin(), vec.end(), sum_member(&yttre::member));
</code>
Vore bra om man kunde använda predikaten även på nästlade strukturer men det verkar inte gå.
(Skulle kanske fungera med bind/lambda men eftersom jag använder VC70 så fungerar inte dessa särskilt bra)