2015-12-21 54 views
1

比方说,我有以下几点:如何为成员的成员创建boost multi_index键?

struct foo { 
    int i; 
}; 

struct bar { 
    foo f; 
}; 

有没有一种方法来创建一个关键f.i(除包装到功能)集装箱,拿着struct bar

直接的方式似乎不工作:

namespace mpi = boost::multi_index; 
typedef mpi::multi_index_container<bar, 
    mpi::indexed_by< mpi::hashed_unique<bar, 
     mpi::member< bar, int, &bar::fo.i>> 
> > Foobar; 

回答

1

这是丑陋的,但它的工作原理。

#include <boost/multi_index_container.hpp> 
#include <boost/multi_index/hashed_index.hpp> 
#include <boost/multi_index/member.hpp> 

struct foo { 
    int i; 
}; 

struct bar { 
    typedef int result_type; 
    foo f; 
}; 

namespace mpi = boost::multi_index; 

typedef mpi::member< bar, int, (int bar::*)(offsetof(bar,f.i))> bar_member; 
             // ^^^^^^^^ bar::f.i  

typedef mpi::multi_index_container< bar, mpi::indexed_by< mpi::hashed_unique<bar, bar_member > > > Foobar; 

Foobar foobar; 

...这个工程太...

typedef mpi::member< bar, int, (int bar::*)((size_t)&(((bar*)0)->f.i))> bar_member; 
+0

为什么struct'bar'中有'result_type' typedef?需要吗? – Slava

+0

@Slava当我试用它时,出现了en错误。添加'result_type'是我的修复。 – Rabbid76

3

多指标的member指数帮手仅设计来访问值类的直接成员,并且不能在嵌套组成办法。

改为使用预期的机制并编写自己的密钥提取器。它将使代码维护比尝试利用基本的内置功能来实现它从未实现的功能要容易得多。

struct foo_i_from_bar 
{ 
    typedef int result_type; 
    result_type operator()(const bar& b) const { return b.f.i; } 
}; 

typedef boost::multi_index::multi_index_container<bar, 
    boost::multi_index::indexed_by< boost::multi_index::hashed_unique<foo_i_from_bar> 
     > > Foobar; 
+0

然后它会更容易使用lambda代替,但据我所知lambda不适用multi_index – Slava

相关问题