読者です 読者をやめる 読者になる 読者になる

Boost.MultiIndex - member_offset

C++

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