代码之家  ›  专栏  ›  技术社区  ›  motam79

如何使用std::get作为Boost多索引容器密钥的全局乐趣?

  •  0
  • motam79  · 技术社区  · 7 年前

    我正在使用 boost::multi-index 用于元组集合的容器,我希望在元组的第一个元素上创建索引。下面是我的解决方案,通过创建一个包装函数 getFirst 并将其传递给 multi_index_container 作为 global_fun

    这个解决方案有效,但我想知道是否可以使用 std::get 直接地 ,而不定义另一个包装函数。

    namespace {
        using my_tuple_t  = std::tuple<int, double>;
    
        int getFirst(my_tuple_t x) {
            return std::get<0>(x);
        }
    
        struct first {
        };
    
        using my_container = bmi::multi_index_container<
                my_tuple_t,
                bmi::indexed_by<
                        bmi::ordered_unique<
                                bmi::tag<struct first>,
                                bmi::global_fun<my_tuple_t, int, &getFirst>
                        >
                >
        >;
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Joaquín M López Muñoz    7 年前

    你可以使用 std::get 直接的,但是你得到的比简单地包装你所做的事情更冗长:

    using my_container = bmi::multi_index_container<
      my_tuple_t,
      bmi::indexed_by<
        bmi::ordered_unique<
          bmi::tag<struct first>,
          bmi::global_fun<const my_tuple_t&, const int&, &std::get<0, int, double>>
        >
      >
    >;
    

    问题是 性病::得到 不是函数而是函数模板的重载集,并且 global_fun 需要一个具体的函数指针,因此需要实例化 性病::得到 所有的模板参数都显式地写下来了。例如,检查 cppreference.com 有关模板参数的说明。