Смещение указателя на член - PullRequest
4 голосов
/ 11 апреля 2011
template<class T, typename U> ptrdiff_t foo(T U::* m)
{
    // return offset
}

Как я могу получить смещение поля 'm' в этом контексте? Я бы предпочел использовать выражение времени компиляции.

Заранее спасибо за любую помощь. С наилучшими пожеланиями

Ответы [ 3 ]

6 голосов
/ 11 апреля 2011

@ Michael J

Спасибо за ваш ответ.Это не совсем то, что я искал, но это вдохновляет меня на это:

template<class T, typename U>
std::ptrdiff_t member_offset(U T::* member)
{
    return reinterpret_cast<std::ptrdiff_t>(
        &(reinterpret_cast<T const volatile*>(NULL)->*member)
    );
}
3 голосов
/ 11 апреля 2011

Похоже, вы ищете макрос offsetof () .

0 голосов
/ 11 апреля 2011

Простой ответ: вы не можете. Если тип U является POD, вы можете использовать макрос offsetof, но формально он не определен поведение, если тип не POD: в зависимости от компилятора, вы получите ошибку во время компиляции или просто неправильно время. И вы не можете использовать его на указатель на член. Вы должны вызвать его с именем класса и именем член.

...