【问题标题】:using boost::mpl::bitor_使用 boost::mpl::bitor_
【发布时间】:2009-10-20 23:16:42
【问题描述】:

我有一个使用 boost::mpl 接受策略类列表的类。每个策略类都包含一个标识标签。我希望 MyClass 生成每个策略类的标识标签的 OR-ed 结果。不幸的是,我在弄清楚如何正确使用 boost::mpl::fold 功能时遇到了一些麻烦。如果有人可以提供帮助,我将不胜感激。

#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;
}

谢谢, 保罗H

【问题讨论】:

    标签: c++ boost boost-mpl


    【解决方案1】:

    我没有明确测试它是否符合您的预期(除了没有获得断言),但由于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 };
    };
    

    继续,foldmpl::vectors 上工作,因此您需要更改 main:

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

    您也不能只将未定义的类型作为模板参数传递 - 因此我必须将 PolicyA 设为非模板类​​。您必须了解如何按照您最初的预期工作。

    【讨论】:

    • 我现在明白了。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多