我有一个使用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 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 我没有明确测试它是否符合您的意图(除了没有得到断言),但是随着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,因此您需要对main进行更改:CMyClass< boost::mpl::vector<PolicyA, PolicyB> > AB;您也不能只将未定义的类型作为模板参数-因此我不得不将PolicyA设置为非模板类​​。您将必须了解如何按照最初的意图进行工作。 (adsbygoogle = window.adsbygoogle || []).push({});
07-27 19:44