Установить методы класса как функции, определенные извне

#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() as void 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 была вызвана соответствующая хэш-функция (автономная функция, объект функции или лямбда), то вместо этого она вызовет эту функцию и вернет ее результат.