我有一个带有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
的代码示例我的多索引类位于共享内存中。
答案 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
}