Мне нужно использовать offsetof
от template
с помощью селектора элементов. Я придумал способ, если вы извините неловкий синтаксис:
template <typename T,
typename R,
R T::*M
>
constexpr std::size_t offset_of()
{
return reinterpret_cast<std::size_t>(&(((T*)0)->*M));
};
Использование не является совершенным (в лучшем случае раздражает):
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), "");
Форма non constexpr
проще в использовании:
template <typename T, typename R>
std::size_t offset_of(R T::*M)
{
return reinterpret_cast<std::size_t>(&(((T*)0)->*M));
};
при очевидном недостатке, что он не выполняется во время компиляции (но проще в использовании):
int main()
{
std::cout << offset_of(&S::x) << std::endl;
std::cout << offset_of(&S::y) << std::endl;
}
Я ищу синтаксис, например, не constexpr
, но все еще полностью компилируемый; однако я не могу придумать синтаксис для него. Я также был бы счастлив с offset_of<&S::x>::value
(как и все остальные черты типа), но не могу понять для него синтаксическую магию.