#c #function
#c #функция
Вопрос:
Я реализую хеш-таблицу, и я написал следующее (фрагмент) определение класса:
template <typename KEY, typename VAL>
class ExtendibleHashTable {
/* Main hash function used. Initially, the identity function. */
size_t hash(KEY key) {
return key;
}
Я хочу дополнительно добавить общедоступный метод, который позволяет устанавливать пользовательскую хэш-функцию. Я знаю об указателях на функции, поэтому я попробовал что-то вроде этого (внизу, в том же определении класса):
/* Set new hash. */
void set_hash(size_t new_hash(KEY)) {
this -> hash = new_hash;
}
Однако это не компилируется.
Можете ли вы сказать мне, как лучше всего добиться этого эффекта? Я просмотрел <functional>
заголовок, но, похоже, это не тот ответ, который мне нужен (или, может быть, я не понял его назначения).
Комментарии:
1. Переназначить функции-члены невозможно. Добавьте указатель на функцию в качестве элемента данных вашего класса (т.Е.
size_t (*func)(KEY)
). Инициализируйте этот элемент как null. Реализуйте свойset_hash()
asvoid set_hash(size_t (*newfunc)(KEY)) {func = newfunc;}
, реализуйте свою хэш-функцию какsize_t hash(KEY key) {return func? func(key) : key;}
Ответ №1:
Вы не можете динамически заменять функции-члены в C . Вы также не можете динамически добавлять функции-члены.
Однако у вас может быть класс, содержащий указатели на функции или std:: function
объекты, которые вы можете изменять во время выполнения. Итак, вы могли бы, например, сделать что-то вроде этого:
class ExtendibleHashTable {
private:
std::function<size_t (KEY)> m_hash_func;
public:
size_t hash(KEY key) {
if (m_hash_func) {
return m_hash_func(key);
}
return key;
}
void set_hash(const std::function<size_t (KEY)>amp; func) {
m_hash_func = func;
}
};
В приведенном выше hash
примере функция по умолчанию просто возвращает key
, если не задана конкретная функция. Но, если set_hash
была вызвана соответствующая хэш-функция (автономная функция, объект функции или лямбда), то вместо этого она вызовет эту функцию и вернет ее результат.