2009-10-20 5 views
1

У меня есть класс, который принимает список классов политик, используя boost :: mpl. Каждый класс политики содержит идентификационный тег. Я бы хотел, чтобы MyClass создавал OR-ed результат каждого идентификационного тега класса политики. К сожалению, у меня возникли проблемы с тем, как правильно использовать функцию boost :: mpl :: fold <>. Если кто-нибудь может помочь, я был бы признателен.using 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; 
} 

Спасибо, PaulH

ответ

2

Я явно не проверены, если он делает то, что вы намерены (кроме не получаю Assert), но, как fold возвращает тип, содержащий значение, то линия, дающая вы об ошибке должно быть:

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

Помимо этого, bitor ожидает, что его аргументы быть интеграл постоянной (doc):

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

Продолжение, fold работы по mpl::vector с, таким образом, вам нужно изменить в главном:

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

Вы также не можете просто передать неопределенный тип в качестве параметра шаблона - таким образом, я должен был сделать PolicyA - не шаблонный класс. Вам нужно будет посмотреть, как работать, что вы изначально планировали там.

+0

Я понимаю сейчас. Спасибо за вашу помощь. – PaulH

Смежные вопросы