1

boost::mplを使用してポリシークラスのリストを受け入れるクラスがあります。各ポリシークラスには、識別タグが含まれています。MyClassで、各ポリシークラスの識別タグのOR化された結果を生成したいと思います。残念ながら、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

4

1 に答える 1

2

(アサーションを取得しないことを除いて)意図したとおりに動作するかどうかを明示的にテストしていませんがfold、値を含む型を返すため、エラーが発生する行は次のようになります。

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

それとは別に、その引数は積分定数doc)であるとbitor期待しています。

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

続行すると、sでfold動作mpl::vectorするため、mainを変更する必要があります。

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

また、未定義の型をテンプレートパラメータとして渡すことはできません。したがって、PolicyAを非テンプレートクラスにする必要がありました。あなたはそこであなたが最初に意図したものを動かす方法を見る必要があるでしょう。

于 2009-10-21T00:43:22.867 に答える