Я не думаю, что вы можете. Со стандартным контейнером вам пришлось бы предоставить фактический экземпляр конструктору. Однако MultiIndex этого не позволяет:
документы
Как поясняется в разделе концепций индекса индексы не имеют общедоступных конструкторов или деструкторов. Назначение, с другой стороны, предусмотрено. При построении max_load_factor() равен 1,0.
Лазейка?
Возможно, вы можете уйти с локально определенным классом:
auto const hash_f = [](int const& n) { return std::hash<int>()(n); };
struct HashType : decltype(hash_f) {};
using AnimalsMultiIndex = multi_index_container<
Animal, indexed_by<hashed_non_unique<
tag<animal_legs>, member<Animal, LegsType, &Animal::legs>,
HashType>>>;
AnimalsMultiIndex animals;
Что работает: требуется c++20
#include <boost/multi_index/hashed_index.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/tag.hpp>
#include <boost/multi_index_container.hpp>
#include <iostream>
#include <string>
using namespace boost::multi_index;
using LegsType = int;
struct Animal {
std::string name;
LegsType legs;
};
// tags
struct animal_legs {};
int main() {
// using lambda doesn't work for hashing
auto const hash_f = [](int const& n) { return std::hash<int>()(n); };
struct HashType : decltype(hash_f) {};
using AnimalsMultiIndex = multi_index_container<
Animal, indexed_by<hashed_non_unique<
tag<animal_legs>, member<Animal, LegsType, &Animal::legs>,
HashType>>>;
AnimalsMultiIndex animals;
animals.insert({ "cat", 4 });
auto const& legs_index = animals.get<animal_legs>();
int num_of_legs = 4;
std::cout << "Number of animals that have " << num_of_legs
<< " legs is: " << legs_index.count(num_of_legs) << '\n';
}
Отпечатки
Number of animals that have 4 legs is: 1
person
sehe
schedule
24.12.2020
std::unordered_set<int, decltype([](auto x){ return hash(x); })> s;
- person Dietmar Kühl   schedule 24.12.2020