2009-10-20 66 views
1

我有一個類接受使用boost :: mpl的策略類列表。每個策略類都包含一個識別標籤。我希望MyClass生成每個策略類'標識標籤的OR-ed結果。不幸的是,我在計算如何正確使用boost :: mpl :: fold功能時遇到了一些麻煩。如果有人能幫助,我將不勝感激。使用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

我還沒有明確,如果它做你(從沒有得到斷言除外)打算什麼測試,但作爲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 S,因此,你需要在主要的變化:

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

你也不能只交給一個未定義的類型作爲模板參數 - 因此,我不得不做出PolicyA是一個非模板類。你必須看到如何去完成你最初的目標。

+0

我現在明白了。謝謝你的幫助。 – PaulH 2009-10-21 13:22:28

相關問題