boost multi index - 循环访问特定条目的键值

时间:2018-04-17 11:23:58

标签: boost-multi-index

我有一个带有2个索引的多索引(在实际代码中,它们的类型不同)。

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

的代码示例

我的多索引类位于共享内存中。

1 个答案:

答案 0 :(得分:0)

你的问题与Boost.MultiIndex没什么关系,并且基本上要求一种编译时迭代类成员的方法。如果你可以将CrUsersKeys定义为std::tuple(或类似元组的类),那么你可以做这样的事情(C ++ 17):

编辑:展示了如何使非元组类适应框架。

<强> Live On 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
}