Установить методы класса как функции, определенные внешне - PullRequest
1 голос
/ 16 апреля 2019

Я реализую хеш-таблицу, и я написал следующее (фрагмент a) определения класса:

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 Ответ

2 голосов
/ 16 апреля 2019

Вы не можете динамически заменять функции-члены в 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)>& func) {
        m_hash_func = func;
    }
};

В приведенном выше описании функция hash по умолчанию просто возвратит key, если не была задана конкретная функция.Но, если set_hash был вызван с соответствующей хеш-функцией (автономная функция, объект функции или лямбда), то он вместо этого вызовет эту функцию и вернет свой результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...