2

したがって、ブーストマルチインデックスコンテナがあります。

using namespace boost::multi_index;
template < typename O >
class Container
{
public:
    multi_index_container<
        O,
        indexed_by<
            ordered_unique<
                const_mem_fun< O, std::string, &O::name >
            >
        >
    > _container;
};

ご覧のとおり、この設計では、このコンテナーを作成するために使用するすべてのオブジェクトに、"name" という名前の文字列を返すメンバー関数が必要です。

これは明らかに理想的ではありません。「キー」を渡す方法をいくつか試しましたが、どれも機能しません..

私はこれを試しました..

using namespace boost::multi_index;
template < typename O, typename KT, typename KM >
class Container
{
public:
    multi_index_container<
        O,
        indexed_by<
            ordered_unique<
                const_mem_fun< O, KT, &KM >
            >
        >
    > _container;
};

int main( int c, char *v[] )
{
    Container< Object, std::string, Object::name > container;
}

しかし、喜びはありません..

コンパイラは、Object::name は型ではないと不平を言いますが、これを修正する方法がわかりません。テンプレートに型を提供する方法を考え出したとしても、コンテナーで使用される "Object::name" の具体的なインスタンスが必要です。

たぶん、型を渡してから、構築時にメンバー関数を渡す必要がありますか? しかし、どうやってコンテナを構築するのですか.. 頭が痛い!?!

以下のAlexyは、このソリューションを親切に提供してくれました

using namespace boost::multi_index;
template < typename O, typename KT, KT (O::* KM)() >
class Container
{
public:
    multi_index_container<
        O,
        indexed_by<
            ordered_unique<
                const_mem_fun< O, KT, KM >
            >
        >
    > _container;
};

int main( int c, char *v[] )
{
    Container< Object, std::string, &Object::name > container;  // <<---- ERROR HERE
}

ただし、これにより次のコンパイラ エラーが発生しました。

Template parameter KM requires an expression of type std::string (Object::*)().

マークされた行で..

Ok。これは、誤って署名された「&Object::name」パラメーターを渡した私のせいであることが判明しました...私はこれを修正しました..

4

1 に答える 1

2

クラス定義を変更します。

template < typename O, typename KT, KT (O::* KM)() >
class Container 
//...

KMの代わりに使用し&KMます。

于 2010-01-28T08:51:51.577 に答える