Предположим, у меня есть простой класс логических признаков, MyTrait
. То есть для любого типа T
я могу сделать MyTrait<T>::value
и получить либо true, либо false. Я хотел бы специализироваться на std::hash
для всех типов T
, где верно MyTrait<T>::value
. Есть какой-либо способ сделать это? Некоторые неудачные попытки:Специализация `std :: hash` для условий встречи классов
template <class T, typename std::enable_if<
MyTrait<T>::value, int
>::type = 0>
struct hash<T> {
...
}
Failed, потому что:
error: default template argument in a class template partial specialization
Я также попытался положить все парциальные вещи специализации после хэша, но потом Eсти сообщения об ошибке для T
быть в не выводятся контекст.
Есть ли способ сделать это? По крайней мере, один предыдущий вопрос на SO предполагает, что нет: Specializing std::hash to derived classes.
Либо решение, либо окончательное «Нет», за которым следует краткое объяснение, было бы отличным ответом.
Поскольку 'станд :: hash' имеет только единственный шаблонный аргумент, единственный вид частичной специализации, который вы можете сделать, - это, например, 'template struct hash > {...}'. Я не вижу никакого способа вызвать отказ замены там, чтобы отключить специализацию. –
melak47
Тем не менее, вы можете предоставить собственный хэш-тип 'std :: unordered_map' и т. Д., Который вы можете оборудовать фиктивным аргументом шаблона для использования специализаций. – melak47
@ melak47 Да, конечно, это вариант, но не слишком высоко для удобства использования. –