したがって、ブーストマルチインデックスコンテナがあります。
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」パラメーターを渡した私のせいであることが判明しました...私はこれを修正しました..