2009-08-16 92 views
3

我使用模板聯盟來保證我自己,我總是得到一個指針64位字段(即使在32位機器上,因爲有數據傳輸到64位機器發生)並保存用戶和我自己的演員。設置默認聯盟成員

template <typename type> union lrbPointer 
{ 
    uint64_t intForm; 
    type ptrForm; //assumed that type is a pointer type 
}; 

//usage 
lrbPointer<int*> myPointer; 
int integers[4]; 
myPointer.ptrForm = integers; 
myPointer.intForm += 2; //making it easy to jump by less then sizeof(int) 

這對我很好,但我真的很想找到一種方法來使默認成員。以便用戶不需要在想要使用的指針後面使用.ptrForm。

+6

你不能這樣做(默認聯盟成員),我看不出有什麼幫助。如果您在兩臺機器之間傳輸指針值,那麼即使它們是相同的架構,該值也不會影響另一臺計算機上的任何內容,因此您的數據傳輸/存儲策略聽起來有點不妥。 – 2009-08-16 22:30:31

+0

我正在詢問接收機器的內存地址,它將啓動數據塊,並利用這些信息我可以計算接收機器上的指針。它當然會使發送機器上的所有內容都無法讀取,但我的目標是在發送機器上執行更多的工作,因爲兩臺機器上的處理器和環境差別很大。 此刻此問題只是一個令用戶看起來令人困惑的代碼問題,我的功能正常。 – Adam 2009-08-17 17:40:00

回答

6

您可以使用一個轉換操作符,使用構造一起,這樣你就可以在類型之間的轉移:

template <typename PtrType> 
union IntPointer 
{ 
    uint64_t intForm; 
    PtrType ptrForm; 

    IntPointer(PtrType ptr) : 
    ptrForm(ptr) 
    { 
    } 

    operator PtrType(void) const 
    { 
     return ptrForm; 
    } 
}; 

int main(void) 
{ 
    IntPointer<float*> f = new float; // constructor 

    float *theFloat = f; // conversion operator 

    delete theFloat; 
} 

這麼說,我覺得薄地踩你。 :|

+0

聲明:我在沒有編譯器的情況下嘗試了這個,讓我知道是否有違背標準的東西。 – GManNickG 2009-08-16 22:39:12

+0

+1男人,我不知道你可以在工會有一個轉換操作符:) – AraK 2009-08-16 22:40:39

+0

這看起來應該是這樣。而且我更喜歡這個更好,然後我得到另一個建議,即使在32位機器上使用某種關鍵字來強制指向64字節的指針(沒有解決鑄造問題)。 – Adam 2009-08-17 17:47:09