2012-01-18 6 views
0

question rapide:pointeur de std :: vecteur de std :: vecteur

Est-il possible de faire un pointeur qui peut faire référence à un std::vector<std::vector<int> > ou un std::vector<std::vector<double>>?

Thx

+0

Que voudriez-vous faire avec ce pointeur? c'est-à-dire, dans quel contexte serait-il utile d'avoir un pointeur qui pourrait pointer sur un 'std :: vector >' ou un 'std :: vector >'? –

+0

Voulez-vous dire un pointeur qui pourrait pointer vers l'un ou l'autre? – MikMik

+0

Oui c'est ce que je voulais dire! –

Répondre

2

Si l'utilisation de boost est une option, vous pouvez utiliser boost:variant. Techniquement, il ne s'agit pas d'un pointeur, mais d'un conteneur à élément unique sûr pour le type, mais il devrait être capable de faire le travail sans avoir recours à la méthode des "gros pistolets" void*.

2

Si vous devez vous pouvez utiliser le syndicat construire

union intordouble 
{ 
    int x; 
    double d; 
}; 

int main() 
{ 
    vector<intordouble> v; 
    return 0; 
} 

Fondamentalement, le vecteur est toujours de la intordouble union de sorte que vous avez un pointeur et ne pas besoin de faire la différence. S'il vous plaît jeter un oeil à Is it a good practice to use unions in C++?

+0

sont-ils une contre-indication à l'utilisation de cela? –

+0

@MatthieuRiegler s'il vous plaît voir mon edit –

+1

Vous ne pouvez pas utiliser cette union sans un moyen de savoir quel type est actuellement en elle. Si tous les éléments d'un vecteur sont du même type, vous pouvez ajouter un membre de données supplémentaire au vecteur pour indiquer le type qu'il contient. Si vous voulez stocker des éléments hétérogènes dans un seul tableau, vous devrez utiliser (ou réinventer) 'boost :: variant'. –

1

void* pourrait pointer à l'un ou l'autre, mais doit être moulé au bon type avant utilisation. Un pointeur typé ne peut pointer que vers le type spécifié, y compris les types qui en héritent. Différentes spécialisations de vector sont de types différents, et ne partagent pas une classe de base commune, donc aucun pointeur typé ne peut pointer vers les deux.

Si c'est vraiment le genre de choses que vous pensez devoir faire, vous pouvez envisager d'utiliser une union discriminée telle que boost::variant pour contenir différents types de pointeurs.

1

<bad_guy_mode>

typedef std::vector<std::vector<int>>* vvi_ptr; 
typedef std::vector<std::vector<double>>* vvd_ptr; 

union int_or_double_vecs{ 
    vvi_ptr int_vector; 
    vvd_ptr double_vector; 
}; 

(Notez que seulement un membre est accessible à la fois et il est seulement celui que vous défini dernier.)

</bad_guy_mode>

Questions connexes