提升多索引 将索引转换为标记并在索引上循环

boost multi index convert index to tag and loop on indexes

本文关键字:索引 循环 转换      更新时间:2023-10-16

我有一个模板类(CrMultiIndex(,它接收一个模板参数,一个 boost multi index(GlobalHash(的定义。我使用 c++14

我需要一种方法将索引转换为标签(n_to_tag(?并在 CrMultiIndex ctor 或 Init 函数中循环索引?我最初的目的是循环索引并在 init 处生成带有 typeid(T(.name(( 的标签名称字符串。所以我可以根据标签名称显示统计信息

我有模板类

template <typename KeysType, typename MultiIndexType>
class CrMultiIndex
{
    std::vector<SrStatisticsByIndex> m_StatsByIndex;
public:
    MultiIndexType *m_pMultiIndex=NULL; 
    CrMultiIndex()
    {
        m_pMultiIndex = new MultiIndexType(typename 
        MultiIndexType::ctor_args_list());
    }

以下是提升多索引容器的定义:

typedef boost::multi_index::multi_index_container<
  CrUsersKeys,
  UsersKey_hash_indices/*,
  bip::allocator<CrUsersKeys,bip::managed_shared_memory::segment_manager>*/
> GlobalHash;

代码处于 http://coliru.stacked-crooked.com/a/d97195a6e4bb7ad4

我在查找提升多索引标签到索引和索引数量时问了一个类似的问题

你可以使用这样的东西:

住在科里鲁

template<typename MultiIndexContainer,std::size_t N>
std::string static_tag_name()
{
 const std::type_info& i=typeid(
    typename boost::mpl::front<
      typename boost::multi_index::nth_index<MultiIndexContainer,N>::
        type::tag_list
    >::type
  );
  return i.name();
}
template<typename MultiIndexContainer,std::size_t... I>
std::string tag_name(std::size_t n,std::index_sequence<I...>)
{
  static std::array<std::string(*)(),sizeof...(I)> a=
    {{static_tag_name<MultiIndexContainer,I>...}};
  return a[n]();
}
template<typename MultiIndexContainer>
std::string tag_name(std::size_t n)
{
  return tag_name<MultiIndexContainer>(
    n,std::make_index_sequence<
      boost::mpl::size<
        typename MultiIndexContainer::index_type_list
      >::value
    >{}
  );
}