Desplazamiento desde el puntero del miembro sin instancia temporal

Me gustaría obtener el desplazamiento de una variable de miembro de diseño estándar cuando se proporciona un poiner a esa variable. No puedo usaroffsetof Ya que tengo un puntero y no un nombre. El código actual que tengo se parece a esto, y me pregunto si hay una manera que cumpla con los estándares para deshacerse de ladummy variable.

template<class T>
struct {
  ptrdiff_t get_offset( int (T::*mem) )
  {
    T dummy;
    return reinterpret_cast<char*>(&(dummy.*mem)) 
      - reinterpret_cast<char*>(&dummy);
  }
};

Esta función solo debe ser invocable conint puntos de la variable miembro (esto es intencional).

Estoy bastante seguro de que el compilador en realidad no crea eldummy variable, pero aún sería bueno si pudiera deshacerme de ella. No puedo usar un puntero nulo ya que la desreferenciación nula no está definida (aunque probablemente funcione en todos los compiladores comunes). Una solución de C ++ 03 sería buena, o una solución de C ++ 11 también es de interés (pero ahora no la puedo usar).

NOTA: Ya sé que esto solo cumple con los estándares si T es un tipo de diseño estándar.

Respuestas a la pregunta(3)

Su respuesta a la pregunta