将类方法设置为外部定义的函数

时间:2019-04-16 10:26:10

标签: c++ function

我正在实现一个哈希表,并且编写了以下(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 个答案:

答案 0 :(得分:2)

您不能在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已使用适当的哈希函数(独立函数,函数对象或lambda)进行了调用,则它将调用该函数并返回其结果。