2010-10-01 5 views
0

J'ai commencé à jouer avec la bibliothèque boost fusion et mpl et je me suis retrouvé avec un problème assez simple.Obtenir l'indice de boost :: fusion :: vector d'un boost :: mpl :: vector

Je déclare les types suivants:

typedef boost::mpl::vector<char, int, long> TypeVector; 
typedef boost::fusion::vector<char, int, long> FusionVector_t; 

Maintenant, je voulais écrire une fonction qui me reçoit la valeur de la FusionVector.

template<size_t N typename T> 
T getValue(FusionVector_t fvec) 
{ 
    return boost::fusion::at_c<N>(fvec); 
} 

La fonction fonctionne comme prévu, mais je voudrais obtenir l'indice de l'boost :: vecteur mpl et l'utiliser dans cette fonction et ne passe pas à la fonction en tant que paramètre de modèle. Mais je n'ai pas compris jusqu'ici comment faire ceci.

Quelqu'un pourrait-il me donner un indice?

Répondre

1

Vous pouvez utiliser l'algorithme de recherche pour obtenir un "itérateur" pointant sur la première occurrence d'un type dans une séquence MPL. Quelque chose comme:

typedef boost::mpl::find<TypeVector, T>::type MplIter; 

puis interroger le vecteur de fusion à ce « iterator » la position de:

return boost::fusion::at_c<MplIter::pos::value>(fvec); 

Cependant, je ne vois pas pourquoi vous utilisez le vecteur de MPL du tout. IIUC, vous voulez définir les getValue comme:

template<class T> 
T getValue(FusionVector_t fvec) 
{ 
    typedef boost::mpl::find<TypeVector, T>::type MplIter; 
    return boost::fusion::at_c<MplIter::pos::value>(fvec); 
} 

qui ne peut fonctionner que si TypeVector et FusionVector_t « contiennent » la même séquence de types. Dans ce cas, pourquoi non seulement utiliser FusionVector_t et écrire:

template<class T> 
T getValue(FusionVector_t fvec) 
{ 
    return *boost::fusion::find<T>(fvec); 
} 

De plus, si vous voulez utiliser « T » comme un « index » dans la séquence de fusion, ce qui rend de sens que si un type donné apparaît une seule fois dans la séquence. Un ensemble fusion :: semble donc plus approprié qu'un vecteur. Dans ce cas, vous auriez:

typedef boost::fusion::set<char, int, long> FusionSet_t; 

template<class T> 
T getValue(FusionSet_t fset) 
{ 
    return boost::fusion::at_key<T>(fset); 
} 
+0

Merci pour le conseil. Le MPL et le vecteur de fusion sont les mêmes. Mais votre approche semble être beaucoup plus propre que la mienne. Aussi la raison pour moi d'utiliser fusion :: vector était parce que je suis venu de la bibliothèque de tuple. Mais je vais m'en tenir à votre proposition. Merci beaucoup – mkaes

Questions connexes