Q1:  Is there a builtin in way in MI to iterate over keys rather than elements? I.e. the iterator's value type will be that of the key, not the element. 

Q2:  Is there a way to obtain the type of key extractors given  a multi index container?  (it is related to Q1, as this sort of a thing could be passed to boost::transform iterator to obtain an alternative answer for Q1)

An example is in order: 

struct Foo {
   int id;
   sting name;
};

using namespace boost::multi_index;

typedef multi_index_container< Foo,  indexed_by<
  ordered_unique< member< Foo, int, &Foo::id > >,
  ordered_unique< member< Foo, string, &Foo::name > >
> MFoo;


MFoo foos;
// .. populate

// Now, we want to iterate over sorted name's only, for e.g: 

auto beg = answer_to_Q1(foos).begin();
auto end = answer_to_Q1(foos).end();
std::copy( beg, end, ostream_iterator<string>(cout, " ") );


// Continuing the example for Q2: 

auto aFunctorThatExtractsFooName = answer_to_Q2<M>::type();
auto beg = make_transform_iterator(  M.get<1>.cbegin(),  aFunctorThatExtractsFooName  );
auto end = make_transform_iterator(  M.get<1>.cend(), aFunctorThatExtractsFooName  );

std::copy( beg, end, ostream_iterator<string>(cout, " ") );


Thanks!
Nick