2017-06-22 4 views
0

quelqu'un peut-il me dire pourquoi ci-dessous l'affirmer échouer?générer mpl :: vecteur <> des clés d'un mpl :: carte

quesiton 1:

typedef mpl::map<mpl::pair<int, unsigned>, mpl::pair<char, unsigned char> > m; 
    typedef mpl::fold<m, mpl::vector<>, mpl::push_back<mpl::_1, mpl::first<mpl::_2>>>::type keys; 
    BOOST_STATIC_ASSERT((std::is_same<boost::mpl::vector<int, char>, keys>::value == 1)); 

question 2: si je veux écrire une fonction fois au produit un mpl :: vectorielle du pointeur sur la clé de la carte, comment dois-je écrire?

template <typename T> 
pointer_type { 
    typedef T* pointer_type; 
} 
     typedef mpl::fold<m, mpl::vector<>, mpl::push_back<mpl::_1, pointer_type<mpl::first<mpl::_2>>>::type>::pointer_type 
> keys; 

semble ne pas fonctionner. le mpl :: _ 2 n'est jamais évalué.

Répondre

1

Le mpl::vector est plus un type de commodité de l'ère pré C++ 11. L'opération mpl::push_back ne renvoie pas un tel vecteur mais une séquence qui peut se développer sans nécessiter de modèles variés.

This Un petit programme de test montre ce qui est retourné.

Une explication détaillée peut être trouvée dans this réponse.