Я имею кодовую базу умеренного размера ( > 200 .cpp
), которые используют функцию hashCode()
для возврата хэш-номера: -
class B01{ //a class
//..... complex thing ....
public: size_t hashCode(){ /* hash algorithm #H01 */}
};
class B02{ //just another unrelated class
//..... complex thing ....
public: size_t hashCode(){/* #H02 */} //This is the same name as above
};
Я использовал его в разных местах, например. в моей пользовательской структуре данных. Он работает хорошо.
Теперь я хочу, чтобы хэш-алгоритм распознавался структурой данных std::
: -
Вот что мне следует сделать: - (изменено с cppreference, я назову этот код #D
).
//#D
namespace std {
template<> struct hash<B01> {
std::size_t operator()(const B01& b) const {
/* hash algorithm #H01 */
}
};
}
Если я вставляю блок #D
(с соответствующей реализацией) в каждый класс (B01
, B02
,...), я могу вызвать: -
std::unordered_set<B01> b01s;
std::unordered_set<B02> b02s;
без передачи второго аргумента шаблона,
и мой алгоритм хеширования (#H01
) будет вызван. ( по умолчанию)
Вопрос
Чтобы он распознал все мои B01::hashCode, B02::hashCode, ...
,
мне нужно вставить блок #D
во все 200+ Bxx.h
?
Можно ли просто добавить одиночный блок #D
(в верхнем заголовке?)
и оттуда повторите маршрут std::anyDataStructure
, чтобы позвонить hashCode()
, когда это возможно?
//pseudo code
namespace std{
template<> struct hash<X> {
std::size_t operator()(const X& x) const { // std::enable_if??
if(X has hashCode()){ //e.g. T=B01 or B02
make this template highest priority //how?
return hashCode();
}else{ //e.g. T=std::string
don't match this template;
}
}
};
}
Это звучит как вопрос SFINAE для меня.
Боковое примечание: Самый похожий вопрос в SO не спрашивал о том, как достичь этого.
Изменить (почему бы мне просто не реорганизовать его?) 3 февраля 2017 года
- Я не знаю, является ли переформатирование грубой силы правильным путем. Я думаю, что может быть лучший способ.
-
hashCode()
- мой дом. Я эмоционально привязываюсь к нему. - Я хочу, чтобы мой код был коротким и чистым, насколько это возможно. Блоки
std::
загрязнены. - Это может быть просто мое любопытство. Если я упрямый, чтобы не реорганизовывать мой код, насколько С++ может уйти?