boost::multi_index::member_offsetというのがあったので調べてみました。
multi_index_containerのインデックスでメンバ変数をキーにするために通常memberを使用しますが、VC6.0やVC7.0といった一部環境でこれが動作しません。
そのためのworkaroundとして、クラスの先頭アドレスからメンバ変数のオフセットを計算してメンバ変数ポインタとしてアクセスするためにあるのがmember_offsetのようです。
これは以下のように使用します。
#include <iostream> #include <string> #include <boost/multi_index_container.hpp> #include <boost/multi_index/ordered_index.hpp> #include <boost/multi_index/member.hpp> #include <boost/assign/list_of.hpp> struct X { int id; std::string name; X() : id(0) {} X(int id, const std::string& name) : id(id), name(name) {} }; using namespace boost::multi_index; typedef multi_index_container< X, indexed_by< ordered_unique<member_offset<X, int, offsetof(X, id)> > > > container; int main() { const container c = boost::assign::list_of (X(3, "A")) (X(1, "B")) (X(4, "C")) ; container::const_iterator it = c.find(1); if (it != c.end()) std::cout << it->name << std::endl; else std::cout << "not found" << std::endl; }
B