повысить мультииндекс - прокрутить ключевое значение конкретной записи

У меня есть мультииндекс с двумя индексами (в реальном коде они разного типа).

class CrUsersKeys{
  int IMSI;
  int TIMESTAMP;
}

После того, как я найду запись в мультииндексе, у меня есть итератор записи.

auto it = multi.GetIteratorBy<IMSI_tag>(searchKey);

Теперь я хочу просмотреть все проиндексированные элементы в этом конкретном (*it) и проверить их. Обратите внимание, что я хочу перебирать не итератор, а индексированный элемент CrUsersKeys. Как мне это сделать?

for(key in it)
{
     if(isGoodKey(key))
         std::cout<<"key "<<key <<" is good key"<<std::endl;
}

Поэтому он должен проверять isGoodKey((*it).IMSI) и isGoodKey((*it).TIMESTAMP). CrUsersKeys — это параметр шаблона, поэтому я не могу точно знать членов CrUsersKeys.

Пример кода на странице http://coliru.stacked-crooked.com/a/d97195a6e4bb7ad4.

Мой мультииндексный класс находится в общей памяти.


person davidbobo    schedule 17.04.2018    source источник


Ответы (1)


Ваш вопрос имеет мало общего с Boost.MultiIndex и в основном требует способа перебора членов класса во время компиляции. Если вы согласны с тем, что CrUsersKeys определяется как std::tuple (или класс, подобный кортежу), вы можете сделать что-то вроде этого (С++ 17):

Изменить: показано, как адаптировать класс, не являющийся кортежем, к платформе.

Прямой эфир на Coliru

#include <tuple>

template<typename Tuple,typename F>
bool all_of_tuple(const Tuple& t,F f)
{
  const auto fold=[&](const auto&... x){return (...&&f(x));};
  return std::apply(fold,t);
}

#include <iostream>
#include <type_traits>

bool isGoodKey(int x){return x>0;}
bool isGoodKey(const char* x){return x&&x[0]!='\0';}

template<typename Tuple>
bool areAllGoodKeys(const Tuple& t)
{
  return all_of_tuple(t,[](const auto& x){return isGoodKey(x);});
}

struct CrUsersKeys
{
  int         IMSI;
  const char* TIMESTAMP;
};

bool areAllGoodKeys(const CrUsersKeys& x)
{
  return areAllGoodKeys(std::forward_as_tuple(x.IMSI,x.TIMESTAMP));
}

int main()
{
  std::cout<<areAllGoodKeys(std::make_tuple(1,1))<<"\n";        // 1
  std::cout<<areAllGoodKeys(std::make_tuple(1,"hello"))<<"\n";  // 1
  std::cout<<areAllGoodKeys(std::make_tuple(1,0))<<"\n";        // 0
  std::cout<<areAllGoodKeys(std::make_tuple("",1))<<"\n";       // 0
  std::cout<<areAllGoodKeys(CrUsersKeys{1,"hello"})<<"\n";      // 1
  std::cout<<areAllGoodKeys(CrUsersKeys{0,"hello"})<<"\n";      // 0
  std::cout<<areAllGoodKeys(CrUsersKeys{1,""})<<"\n";           // 0
}
person Joaquín M López Muñoz    schedule 18.04.2018
comment
Я не думаю, что буду делать это кортежем, это сделает код слишком сложным. Спасибо за Ваш ответ - person davidbobo; 18.04.2018
comment
Отредактировал ответ, чтобы показать, как CrUsersKeys можно заставить работать с предлагаемой структурой. - person Joaquín M López Muñoz; 18.04.2018