如何将std :: get用作boost-multi-index容器密钥的global_fun?

时间:2019-01-22 02:27:18

标签: c++ tuples boost-multi-index

我正在使用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 个答案:

答案 0 :(得分:0)

您可以直接使用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,以获取有关所涉及的模板参数的说明。