我需要使用带有成员选择器的offsetof
from a 。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), "");
非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
(就像其他类型特征一样)感到满意,但无法弄清楚它的语法魔法。