
Thanks Joaquin, I've played with your example and I find it very useful! Now the appetite grew and combining your example with the custom key extractor docs you provided, I am trying to move to a single class with a multi index member. However, I cannot compile it. My attempt is now to use a 128bit integers, and extract MSB/LSB as before. The difference is using a const member function. Of course, I've specialized std::less for my type. The errors are puzzling to me. Here they are: == LOG == In file included from Data.h:15: /usr/local/include/boost/multi_index/mem_fun.hpp:42:50: error: member pointer refers into non-class type 'unsigned __int128' template<class Class,typename Type,Type (Class::*PtrToMemberFunction)()const> Data.h:42:32: note: while substituting prior template arguments into non-type template parameter 'PtrToMemberFunction' [with Class = unsigned __int128, Type = unsigned long long] ordered_non_unique<const_mem_fun<__uint128_t, uint64_t, &soData::msb>>, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Data.h:42:83: error: expected a type ordered_non_unique<const_mem_fun<__uint128_t, uint64_t, &soData::msb>>, ^ /Users/sensei/Documents/Projects/sparql/Sparql/Sparqlo/soData.h:45:5: error: expected a type > soDataStorage; ^ == END == I must confess I cannot understand what type it expects. From the documentation I see that I need in const_mem_fun<> in order, the input type, the output type, and the address of a member function, a const member in my case. // sort by less<int> on name_length() ordered_non_unique< const_mem_fun<employee,std::size_t,&employee::name_length> > I believe less<> isn't a problem, since it should work on 128bit integers with my specilization... I think! Can anyone help me? Thanks & Cheers! #include <boost/multi_index_container.hpp> #include <boost/multi_index/mem_fun.hpp> #include <boost/multi_index/ordered_index.hpp> #include <functional> using namespace boost::multi_index; namespace std { template<> struct less<__uint128_t> { bool operator()(const __uint128_t& x, const __uint128_t& y) const { return x < y; } }; }; using namespace boost::multi_index; class Data { public: Data(); uint64_t msb(__uint128_t storage) const { return static_cast<uint64_t>(storage >> 64); }; uint64_t lsb(__uint128_t storage) const { return static_cast<uint64_t>(storage & 0xFFFFFFFFFFFFFFFF); }; private: typedef multi_index_container< __uint128_t, indexed_by< ordered_non_unique<const_mem_fun<__uint128_t, uint64_t, &Data::msb>>, ordered_non_unique<const_mem_fun<__uint128_t, uint64_t, &Data::lsb>> > > DataStorage; };