2009-08-16 95 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