2009-10-20 5 views
1

J'ai une classe qui accepte une liste de classes de politiques utilisant boost :: mpl. Chaque classe de stratégie contient une balise d'identification. Je voudrais que MyClass produise le résultat OR-ed de la balise d'identification de chaque classe de politique. Malheureusement, je n'arrive pas à comprendre comment utiliser correctement la fonctionnalité boost :: mpl :: fold >. Si quelqu'un peut aider, je l'apprécierais.en utilisant boost :: mpl :: bitor_

#include <boost/mpl/vector.hpp> 
#include <boost/mpl/bitor.hpp> 
#include <boost/mpl/inherit.hpp> 
#include <boost/mpl/inherit_linearly.hpp> 

namespace bmpl = boost::mpl; 

template< class ListOfPolicies > 
class CMyClass : public bmpl::inherit_linearly< ListOfPolicies, bmpl::inherit< bmpl::_1, bmpl::_2 > >::type 
{ 
public: 
    int identifier() const 
    { 
     // error C2039: 'tag' : is not a member of 'PolicyA' 
     return bmpl::fold< ListOfPolicies, bmpl::int_<0>, bmpl::bitor_< bmpl::_1, bmpl::_2 > >::value 
    } 
}; 

template< class T > 
class PolicyA 
{ 
public: 
    enum { MY_IDENTIFIER = 0x00000001 }; 
}; 

class PolicyB 
{ 
public: 
    enum { MY_IDENTIFIER = 0x00000010 };  
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{  
    CMyClass< PolicyA, PolicyAB > AB 
    assert(AB.identifier() == (PolicyA::MY_IDENTIFIER | PolicyB::MY_IDENTIFIER)); 
    return 0; 
} 

Merci, PaulH

Répondre

2

Je n'ai pas testé explicitement si elle fait ce que vous avez l'intention de (en dehors de ne pas obtenir le assert), mais comme fold retourne un type contenant une valeur, la ligne donnant vous devez être une erreur:

return bmpl::fold< ListOfPolicies, 
        bmpl::int_<0>, 
        bmpl::bitor_<bmpl::_1, bmpl::_2> 
       >::type::value; 

En dehors de cela, bitor attend ses arguments pour être une constante intégrale (doc):

class PolicyA 
{ 
public: 
    typedef boost::mpl::integral_c_tag tag; 
    typedef int value_type; 
    enum { value = 0x00000001 }; 
}; 

continue, fold travaux sur mpl::vector s, donc vous avez besoin d'un changement principal:

CMyClass< boost::mpl::vector<PolicyA, PolicyB> > AB; 

Vous ne pouvez pas simplement la main aussi un type non défini comme paramètre de modèle - je devais donc faire PolicyA une classe non-template. Vous devrez voir comment travailler ce que vous aviez prévu à l'origine.

+0

Je comprends maintenant. Merci de votre aide. – PaulH

Questions connexes