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

これを行うことはできません(デフォルトのユニオンメンバー)。どのように役立ちますか。 2台のマシン間でポインタ値を送信すると、同じアーキテクチャであっても、その値は他のマシン上のものを意味しないため、データ転送/ストレージ戦略に問題があるように聞こえるでしょうか? –

+0

私は受信機にデータのブロックを開始するメモリアドレスを要求しています。その情報で、受信側のマシン上のポインタを計算することができます。もちろん、送信側のマシンではすべてを読むことができませんが、私の目標は、両方のマシン上のプロセッサーと環境が非常に異なるため、送信側のマシンでより多くの作業を行うことです。 現時点では、この問題はユーザーのための見た目の混乱の問題にすぎません。私は機能しています。 – Adam

答えて

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

+0

+1男、私はあなたが組合で変換演算子を持つことができるか分からなかった:) – AraK

+0

これはトリックを行う必要があるように見えます。私はこれを良くして、別の提案をしました。私は、ある種のキーワードを使って32ビットマシン上で64バイトのポインタを強制的に出すようにしました(キャストの問題を修正しませんでした)。 – Adam

関連する問題