如何计算类成员在编译时的偏移量? [英] How to calculate offset of a class member at compile time?
问题描述
在C ++中给定类定义
class A
{
public:
//方法定义
....
private:
int i;
char * str
....
}
一个类成员在编译时使用C ++模板元编程?类不是POD,并且可以有虚方法,基本和对象数据成员。
基于Matthieu M.的回答,但更短,没有宏:
template< typename T,typename U> constexpr size_t offsetOf(U T :: * member)
{
return(char *)&((T *)nullptr-> * member) - (char *)nullptr;
}
这样调用:
struct X {int a,b,c,d; }
std :: cout<< offset of c in X ==<< offsetOf(& X :: c);
编辑:
Jason Rice是正确的。这不会在C ++ 11中产生实际的常量表达式。鉴于 http://en.cppreference.com/w中的限制,它看起来不太可能/ cpp / language / constant_expression - 特别是没有指针差异,
reinterpret_cast
可以在常量表达式中。Given a class definition in C++
class A { public: //methods definition .... private: int i; char *str; .... }
Is it possible to calculate the offset of a class member at compile time using C++ template meta-programming? The class is not POD, and can have virtual methods, primitive and object data member.
解决方案Based on Matthieu M.'s answer but shorter and with no macros:
template<typename T, typename U> constexpr size_t offsetOf(U T::*member) { return (char*)&((T*)nullptr->*member) - (char*)nullptr; }
And it's called like this:
struct X { int a, b, c, d; } std::cout << "offset of c in X == " << offsetOf(&X::c);
Edit:
Jason Rice is correct. This will not produce an actual constant expression in C++11. It doesn't look possible given the restrictions in http://en.cppreference.com/w/cpp/language/constant_expression -- in particular no pointer difference and
reinterpret_cast
can be in a constant expression.这篇关于如何计算类成员在编译时的偏移量?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!