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

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

我正在为元组集合使用 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 以了解所涉及的模板参数的解释。