Как использовать std :: get в качестве global_fun ключей контейнеров boost-multi-index? - PullRequest
0 голосов
/ 22 января 2019

Я использую контейнер 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 голосов
/ 28 января 2019

Вы можете использовать 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 для объяснения параметров шаблона.

...