Как получить указатель на член из указателя класса и простой указатель на член в 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;
}
Другие вопросы по тегам