Можно ли используя structured bindings написать шаблонную универсальную хэш-функцию для std::unordered_map при условияя, что для каждого из полей структуры есть (стандартная) хэш функция?
Здравствуйте, B0FEE664, Вы писали:
BFE>Можно ли используя structured bindings написать шаблонную универсальную хэш-функцию для std::unordered_map при условияя, что для каждого из полей структуры есть (стандартная) хэш функция?
#include <boost/pfr/functors.hpp>
struct my_struct { // No operators defined for that structureint i; short s; char data[7]; bool bl; int a,b,c,d,e,f;
};
// ...
std::unordered_set<
my_struct,
boost::pfr::hash<my_struct>,
boost::pfr::equal_to<my_struct>
> my_set;
Здравствуйте, B0FEE664, Вы писали:
BFE>Какая-то очень сложная реализация: я так и не понял как они получают tuple с ссылками на поля...
Бинарным поиском до некоего N в компайл тайме находят количество полей, ну а дальше обычные structured bindings.
BFE>Думаю можно по-простому, написал вот такой код:
Если всегда 2 поля, то да.
Re[3]: std::unordered_map и структура с двумя полями
Здравствуйте, andrey.desman, Вы писали:
AD>Бинарным поиском до некоего N в компайл тайме находят количество полей, ну а дальше обычные structured bindings.
В качестве некоего N берется sizeof всей структуры. Это дает оценку сверху максимально возможного числа полей. А дальше идут декрементом. Бинарный поиск не катит, ибо агрегатная инициализация допускает меньшее количество элементов в инициализаторе, чем число полей в структуре.
Здравствуйте, rg45, Вы писали:
R>В качестве некоего N берется sizeof всей структуры. Это дает оценку сверху максимально возможного числа полей. А дальше идут декрементом. Бинарный поиск не катит, ибо агрегатная инициализация допускает меньшее количество элементов в инициализаторе, чем число полей в структуре.
Всего-то надо найти первое количество полей, которыми уже нельзя проинициализировать.
P.S. Да и кортежи с сылками на поля видятся мне некоторым овердизайном. При нормальных обобщённых подходах к программированию достаточно просто иметь возможность интерпретировать произвольную структуру как tuple-like тип.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, andrey.desman, Вы писали:
BFE>>Какая-то очень сложная реализация: я так и не понял как они получают tuple с ссылками на поля... AD>Бинарным поиском до некоего N в компайл тайме находят количество полей, ну а дальше обычные structured bindings.
Я ожидал, что для начала будет вызвана функция
template <class T>
constexpr auto structure_to_tuple(const T& val)
вот она
а потом к результату будет применён подсчёт hash.
А в реальности какой-то сложный подсчёт одновременно с разбором...
BFE>>Думаю можно по-простому, написал вот такой код: AD>Если всегда 2 поля, то да.
Этот код, кстати, похож на:
template <class T>
constexpr auto tie_as_tuple(T& val, size_t_<2>) noexcept {
auto& [a,b] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.return ::boost::pfr::detail::make_tuple_of_references(detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b));
}