我正在实现一个哈希表,并且编写了以下(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>
标头,但这似乎并不是我需要的答案(或者也许我不明白其目的)。
答案 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)进行了调用,则它将调用该函数并返回其结果。