我有一个使用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;
}
谢谢, PaulH
答案 0 :(得分: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成为非模板类。你必须看看如何使你原本打算在那里工作。