如何使用 std::get 作为 boost-multi-index 容器键的global_fun

How to use std::get as a global_fun of boost-multi-index container keys?

本文关键字:global fun boost-multi-index std 何使用 get 作为      更新时间:2023-10-16

我正在使用boost::multi-index容器来收集元组,我想在元组的第一个元素上创建一个索引。这是我的解决方案,通过创建一个包装函数getFirst并将其作为global_fun传递给multi_index_container的模板参数

这个解决方案有效,但我想知道是否可以直接使用 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>
                    >
            >
    >;
}
你可以

直接使用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>>
    >
  >
>;

问题在于std::get不是一个函数,而是函数模板的重载集,global_fun需要一个具体的函数指针,因此要做到这一点,您需要实例化std::get,并明确写下其所有模板参数。例如,检查 cppreference.com 以获取所涉及的模板参数的说明。