Создание функции std :: hash, которая принимает любой итеративный тип - PullRequest
3 голосов
/ 07 июня 2019

Я попытался реализовать функцию std::hash, которая работает на любом типе итератора, где пользователь должен реализовать функцию хеширования для своего типа T.Моя первоначальная реализация функции std::hash для std::array будет показана ниже:

template <typename T, size_t N>
struct std::hash<std::array<T, N>> {
    std::size_t operator()(const std::array<T, N>& x) const {
        auto hash_func = std::hash<T>{};
        size_t h_val{};
        for (T t : x) {
            h_val = h_val ^ hash_func(t);
        }
        return h_val;
    }
};

Для поддержки любого итератора я пытался использовать sfinae, где моя текущая реализация типа контейнера is_container можетбудет видно ниже:

template <typename T, typename = void> // primary declaration
struct is_container: std::false_type {}; // when all specializations fail

template <typename T>
struct is_container< // specialization
        T, // conditions:
        std::void_t<decltype(std::begin(std::declval<T&>()))>
>: std::true_type {};

template <typename C>  // *_v value
constexpr auto is_container_v = is_container<C>::value;

Моя проблема в том, что я не могу подобрать требуемые параметры для struct std::hash<>.

...