gpt4 book ai didi

c++ - 将私有(private)结构哈希运算符转换为静态

转载 作者:太空宇宙 更新时间:2023-11-04 12:57:58 25 4
gpt4 key购买 nike

我已经实现了一个 A 类,它包含 B 类实例的 unordered_set,使用自定义哈希函数。

文件a.hh:

#include "b.hh"

class A {

private:
struct HashB_ {
size_t operator()( const B & ) const ;
};

typedef std::unordered_set< B, A::HashB_ > HashTable_t_ ;

HashTable_t_ hash_table_;
};

文件a.cpp:

#include "a.hh"

size_t
A::HashB_::operator()( const B & b ) const {
return b.getHash();
}

其中 b.getHash() 实现实际的散列。

我的目标是使这个私有(private)哈希函数静态,如果可能的话,因为它根本不与类A 的成员交互>。在 A 类之外定义哈希器是一种替代方法,但我希望将实现隐藏在 A 类之外。

如果我尝试声明 static size_t operator()( const B & );,我会收到以下编译错误:必须是非静态成员函数

如果我声明 static struct HashB_,我会收到以下错误:只能为对象和函数指定存储类

是否可以将这个私有(private)哈希器变成一个私有(private)“静态”哈希器?这样做有意义吗?或者我应该使用 friend 哈希器来隐藏实现?

最佳答案

函数调用运算符确实需要一个对象才能工作,即使他们不需要接触该对象。这是为查找函数调用运算符建立相关上下文的有意选择。该运算符不能是 static

可以在类A 中使用static 函数。然而,无序容器使用一个对象来指定散列操作。指向 static 成员的函数指针是一个合适的对象。但是,您需要为散列器模板参数使用函数指针类型,并将函数指针传递给无序 cintainer 的构造函数。除了这种语法上的复杂性之外,这种方法可能会对性能产生负面影响:编译器非常擅长内联成员函数,这些成员函数不会触及任何 if 成员。他们确实很难用函数指针进行适当的分析,即使是在看起来很简单的情况下也是如此。

tl;dr:不用担心没有任何成员的散列对象和非静态的函数调用运算符:这可能是最有效的方法!

关于c++ - 将私有(private)结构哈希运算符转换为静态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45652255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com