[英]C++ conversion: have pointer to object member, calculate pointer to object
C ++有static_cast
将base_class_pointer
转换为derived_class_pointer
。
将object_data_member_pointer
转换为object_pointer
是非常相似的操作。
我使用不安全的C类型转换编写了函数ConvertDataMemberPtrToObjectPtr
。
member_ptr
。 资源:
#include <stdio.h>
#include <tchar.h>
template< class T, class Member_type, Member_type T::*member_ptr >
inline T *ConvertDataMemberPtrToObjectPtr(Member_type& member) {
//Got reference to member 'member' of object 'T', return pointer to object 'T'
// obj_ptr = member_ptr - offset_of_member_field
return (T*) ( ((char*)(&member)) - ( (char*) ( &( ((T*)(0))->*member_ptr ) ) ) );
}
struct Test {
int a;
int b;
};
int _tmain(int argc, _TCHAR* argv[]) {
Test obj;
printf("\n0x%08lX", ConvertDataMemberPtrToObjectPtr<Test,int,&Test::a>(obj.a));
printf("\n0x%08lX", ConvertDataMemberPtrToObjectPtr<Test,int,&Test::b>(obj.b));
// This is must be avoided when using ConvertDataMemberPtrToObjectPtr!!!
printf("\n0x%08lX - error!", ConvertDataMemberPtrToObjectPtr<Test,int,&Test::a>(obj.b));
return 0;
}
使用父代替成员和static_cast
:
template <class T, int id=0>
class Link {
public:
int value;
T *GetObjectPtr() { return static_cast<T*>(this); }
};
enum MyLinkId { Main=0, Red=1 };
class MyItem : public Link<MyItem,Main>, public Link<MyItem,Red> {};
MyItem x;
Link<MyItem,Main> *p2 = &x;
Link<MyItem,Red> *p3 = &x;
printf("\n0x%08lX", p2->GetObjectPtr());
printf("\n0x%08lX", p3->GetObjectPtr());
你想要实现的目标是不可能的:缺少区分成员的信息。 您需要一个唯一的参考成员,您可以将其传递给转换函数。
struct UniqueReferenceMember {};
struct Test {
UniqueReferenceMember unique_reference_member;
int a;
int b;
};
但这样做毫无意义。 有对象指针,你可以直接传递(可能转换为void *);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.