簡體   English   中英

C ++轉換:具有指向對象成員的指針,計算指向對象的指針

[英]C++ conversion: have pointer to object member, calculate pointer to object

C ++有static_castbase_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM