如何在HASHER中使用非静态成员功能
How to use a non-static member function in Hasher?
我需要使用与默认的哈希人建立哈希表,因此我写了类似的内容:
class foo {
public:
...
private:
struct myhasher {
size_t operator() (myclass bar) { return hash_calculation bar; }
}
static size_t hash_calculation (myclass bar) {
// do some calculation
}
hash_map<myclass, myhasher> myhashmap;
}
它有效。现在,由于某种原因,我必须编写一个非静态成员函数来替换Hash_calculation,例如,它需要该类的非静态成员作为参数。然后整个过程失败了,因为我无法在嵌套结构中使用非静态方法。
这与另一个广泛讨论的问题相似:如何使用非静态功能进行比较或排序。例如,请参见:在比较功能中使用非静态类成员和C STD列表与自定义比较器对对象实例的成员变量进行排序。他们都建立了函子,而不是作为比较器的函数。但是,就我而言,此技巧不起作用,因为我需要Hash_map定义中的类名,而不是特定的结构对象。我应该怎么办?预先感谢您的帮助!
你不能。hash_map
应该如何知道拨打myhaser::hash_calculation
时应使用哪个myhasher
的实例?
hash_map
不是标准C 库的一部分,甚至在C 11中也不是一个自定义类,并且您不包含有关其工作原理的信息。如果它有一种方法可以使用某种构造函数的参数,则可以使用myhasher
,那么您很幸运。但这听起来不像。
另外,当您可能意味着要通过const引用时,您就会使用通过值。通过价值传递可能真的很慢,效率低下。
标准" hash-map",即 std::unordered_map<K, V, H, E, A>
将类型 H
的哈希对象作为构造函数参数。该对象的副本用于通过函数调用操作员来确定对象的哈希。这种方式可以提供一些上下文。显然,您已经在使用非静态函数调用操作员,但您选择委派给静态成员。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 类模板的成员功能的定义在单独的TU中完全专业化
- 如何在C++中使用非静态成员函数作为回调函数
- (C++)为什么静态成员可以在初始化之前使用
- 类的全局对象和静态成员
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- C 11螺纹 - 非静态成员功能的使用无效 - 工作GCC 5.1.0损坏的GCC 7.3.1
- 将非静态成员函数C 的使用无效,而将成员功能作为函数变量
- 线程安全性和静态变量/成员功能
- 静态成员在姓氏中功能
- 通过静态成员功能使ADL工作
- 如何在C 11中创建指针映射以静态成员功能
- 静态成员功能和全局功能之间有什么不同
- 提升侵入性unordered_set静态成员功能返回错误的尺寸类型
- 一个类本身有一个静态成员的功能是什么?
- C 功能指针指向静态指针对象的成员功能
- 应在共享库中避免静态成员功能
- 如何用功能指针作为参数初始化静态成员的模板
- 如何在HASHER中使用非静态成员功能
- 为什么没有将虚拟静态成员添加为C++的一个功能