2009-08-16 7 views
3

J'utilise des unions de modèles pour m'assurer que je reçois toujours un champ de 64 bits pour les pointeurs (même sur les machines 32 bits car il y a transmission de données vers une machine 64 bits) et pour sauver à la fois l'utilisateur et moi-même casting.définition d'un membre de syndication par défaut

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) 

Ceci fonctionne bien pour moi, mais j'aimerais vraiment trouver un moyen de faire un membre par défaut. de sorte que l'utilisateur n'a pas besoin d'utiliser .ptrForm après le pointeur qu'il souhaite utiliser.

+6

Vous ne pouvez pas faire cela (membre de syndicat par défaut), et je ne vois pas comment cela aide. Si vous transmettez une valeur de pointeur entre deux machines, la valeur ne signifiera rien sur l'autre machine même si elles sont de la même architecture, donc il semble que quelque chose ne va pas avec votre stratégie de transmission/stockage de données? –

+0

Je demande à la machine réceptrice l'adresse mémoire où elle va démarrer le bloc de données, avec cette information je peux calculer les pointeurs sur la machine réceptrice. Bien sûr, tout est illisible sur l'expéditeur, mais mon but est de faire plus de travail sur l'expéditeur en raison des processeurs et des environnements très différents sur les deux machines. pour le moment ce problème est seulement un problème de code à la recherche confus pour l'utilisateur, j'ai la fonctionnalité de travail. – Adam

Répondre

6

Vous pouvez utiliser un opérateur de conversion, avec un constructeur, de sorte que vous pouvez transférer entre les types:

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; 
} 

Cela dit, je pense que vous avez foulé le sol mince. : |

+0

Avertissement: J'ai essayé cela sans compilateur, laissez-moi savoir si quelque chose va à l'encontre de la norme. – GManNickG

+0

+1 Man, je ne savais pas que vous pouvez avoir un opérateur de conversion dans un syndicat :) – AraK

+0

cela ressemble à ça devrait faire l'affaire. et j'aime mieux cela, puis une autre suggestion que j'ai eu à propos de l'utilisation d'un mot-clé pour forcer un pointeur à 64 octets, même sur une machine 32 bits (n'a pas résolu les problèmes de casting). – Adam

Questions connexes