Заставить структуру данных std использовать мою существующую нестатическую хэш-функцию "hashCode()" по умолчанию.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Заставить структуру данных std использовать мою существующую нестатическую хэш-функцию "hashCode()" по умолчанию.

Сообщение Anonymous »


У меня есть кодовая база среднего размера (>200 .cpp), которая использует функцию hashCode() для возврата хеш-числа: -

class B01{ //класс //.....сложная вещь.... public: size_t hashCode(){ /* алгоритм хеширования #H01 */} }; class B02{ //просто еще один несвязанный класс //.....сложная вещь.... public: size_t hashCode(){/* #H02 */} //Это то же имя, что и выше. }; Я использовал его в разных местах, например. в моей пользовательской структуре данных. Это работает хорошо.

Теперь я хочу, чтобы алгоритм хеширования распознавался структурой данных std:::-

Вот что мне следует сделать:- (изменено из cppreference, я назову этот код #D).

//#D пространство имен станд { шаблон структура hash { std::size_toperator()(const B01& b) const { /* алгоритм хеширования #H01 */ } }; } Если я вставлю блок #D (с соответствующей реализацией) в каждый класс (B01,B02,...), я могу позвонить :-

std::unordered_set b01s; std::unordered_set b02s; без передачи второго аргумента шаблона,
и будет вызван мой алгоритм хеширования (#H01). (по по умолчанию)
Вопрос
Чтобы он распознавал все мои B01::hashCode, B02::hashCode, ...,
мне нужно вставить блок #D во все 200+ Bxx.h?

Могу ли я просто добавить один блок #D (в верхний заголовок?)
и оттуда перенаправить std::anyDataStructure для вызова hashCode() всякий раз, когда это возможно?

//псевдокод пространство имен стандартное { шаблон структура hash { std::size_toperator()(const X& x) const { // std::enable_if?? if(X имеет hashCode()){ //например. Т=B01 или B02 сделать этот шаблон наивысшим приоритетом //как? вернуть хэш-код(); }else{ //например. Т=стд::строка не соответствует этому шаблону; } } }; } Для меня это звучит как вопрос SFINAE.

Примечание: Самый похожий вопрос в SO не спрашивал о том, как этого добиться.

Изменить (почему бы мне просто не провести рефакторинг? ; 3 февраля 2017 г.)
[*]Я не знаю, является ли рефакторинг методом грубой силы правильным путем. Я думаю, что может быть лучший способ. [*]hashCode() — мой дом. Я эмоционально к этому привязываюсь. [*]Я хочу, чтобы мой код был максимально коротким и понятным. Блоки std:: загрязнены. [*]Возможно, это просто мое любопытство. Если я буду упорно отказываться от рефакторинга своего кода, как далеко сможет зайти C++?
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»