Как использовать функцию is_transparent в строковом литерале с unordered_map из std::string?

Оглядываясь на cppreference, я обнаружил, что std::unordered_map получает эффективный поиск из "эквивалентных ключей".

Я считаю, что эквивалентный ключ должен иметь одно и то же значение хэш-функции. Как я могу предоставить это для строкового литерала, я получаю то же значение хэша, что и для std::hash<std::string>, не создавая временную конструкцию std::string и тем самым делая всю суть эквивалентных ключей для ничего?

Ответ 1

Это была ошибка в cppreference; нет шаблонных находок для неупорядоченных связанных контейнеров.

Сравните, с n3690,

от §23.5.4.1[unord.map.overview]

// lookup
iterator find(const key_type& k);
const_iterator find(const key_type& k) const;
size_type count(const key_type& k) const;

from §23.4.4.1[map.overview]

// 23.4.4.5, map operations:
iterator find(const key_type& x);
const_iterator find(const key_type& x) const;
template <class K> iterator find(const K& x);
template <class K> const_iterator find(const K& x) const;
size_type count(const key_type& x) const;

Ответ 2

Как говорили другие, неупорядоченные ассоциативные контейнеры не поддерживают режим is_transparent. Boost.MultiIndex хешируют индексы, с другой стороны, разрешают то, что вы хотите, как объяснено в , в случае, если вы можете заменить std::unordered_map на эквивалентную конструкцию на основе multi_index_container.