Tengo la necesidad de utilizar offsetof
desde un template
con un selector de miembros. Yo he llegado con una forma, si me disculpa la sintaxis incómoda:C++ Tiempo de compilación offsetof dentro de una plantilla
template <typename T,
typename R,
R T::*M
>
constexpr std::size_t offset_of()
{
return reinterpret_cast<std::size_t>(&(((T*)0)->*M));
};
uso no es perfecto (molesto en el mejor):
struct S
{
int x;
int y;
};
static_assert(offset_of<S, int, &S::x>() == 0, "");
static_assert(offset_of<S, int, &S::y>() == sizeof(int), "");
La forma no es fácil constexpr
de usar:
template <typename T, typename R>
std::size_t offset_of(R T::*M)
{
return reinterpret_cast<std::size_t>(&(((T*)0)->*M));
};
en la desventaja obvia de que no se realiza en tiempo de compilación (pero más fácil de usar):
int main()
{
std::cout << offset_of(&S::x) << std::endl;
std::cout << offset_of(&S::y) << std::endl;
}
Lo que estoy buscando es la sintaxis como la variedad no constexpr
, pero aún completamente tiempo de compilación; sin embargo, no puedo encontrar la sintaxis para ello. También estaría contento con un offset_of<&S::x>::value
(como el resto de los rasgos de tipo), pero no puedo entender la sintaxis mágica para él.
Estoy tratando de averiguar en qué parte del estándar dice que hace lo que espera que haga. Pero no puedo encontrarlo –
¿Qué pasa con el estándar ['offsetof'] (http://en.cppreference.com/w/cpp/types/offsetof)? –
@NicolBolas Supongo que no. ¿No debería la eliminación de un 'nullptr' (y creo que' -> 'cuenta como desreferencia) ser UB ya? Pero, de nuevo, la versión de VC de la macro 'offsetof' no es diferente. Entonces, en la práctica, es más bien una implementación definida que indefinida. –