Как получить указатель на член из указателя класса и простой указатель на член в C++?
Я могу получить простой указатель на член экземпляра объекта, как в примере. Как мне сделать это в обратном направлении?
struct S {
int i;
};
// We have a pointer to an instance of S and an int member pointer in S.
// This function returns a pointer to the pointer member in the pointed object.
int* from_mptr(S* s, int S::* mp) {
return &(s->*mp);
}
// How to implement this?
// We have the object pointer and a pointer to a member of this object instance.
// I would like to have a member pointer from these.
int S::* to_mptr(S* s, int* p) {
// return ???
}
Технически это должно быть возможно, потому что разница между объектом и членом в экземпляре - это указатель на член. Хотя я не знаю правильного синтаксиса.
1 ответ
Решение
Выполните итерации по каждому отдельному члену структуры, который имеет тот же тип, что и указатель, и сравните его адрес с предоставленным указателем - если они совпадают, верните соответствующий указатель на член. Для представленного примера игрушки:
int S::* to_mptr(S* s, int* p) {
if (&s->i == p) {
return &S::i;
}
return nullptr;
}