使用在内部结构定义中保存函数的类成员变量,这些函数将用作 unordered_map 对象的模板参数
Posted
技术标签:
【中文标题】使用在内部结构定义中保存函数的类成员变量,这些函数将用作 unordered_map 对象的模板参数【英文标题】:Using class member variables that hold functions in definition of inner structures that will be used as template arguments of an unordered_map object 【发布时间】:2015-10-18 06:20:53 【问题描述】:我正在实现一个使用unordered_map
的对象。对象是通用的,所以模板无处不在。特别是 operator==
和 operator()
被包装到结构中,unordered_map
使用这些结构分别检查键是否相等并为键生成哈希值。我希望用户编写自己的函数来实现上述两个运算符并将这些方法作为输入传递给类对象。然后结构将使用这些对象。我在使用范围时遇到了一些问题,似乎不知道该怎么做。这是我的代码:
#include <unordered_map>
#include <iostream>
#include <string>
#include <functional>
template <typename O>
class aClass
public:
aClass( bool (usrIsEq)(O, O) ,
std::size_t (usrHashFtn)(O) )
this->usrIsEq = usrIsEq;
this->usrHashFtn = usrHashFtn;
void add(O k, std::string v)
iTable[ k ] = v;
std::string get(O k)
return iTable[ k ];
private:
bool (*usrIsEq)(O, O);
std::size_t (*usrHashFtn)(O);
struct Key
O obj;
bool operator==(const Key &other) const
std::cout << "obj " << obj << std::endl;
return usrIsEq(obj, other.obj);
;
struct KeyHasher
std::size_t operator()(const Key &k) const
return usrHashFtn(k);
;
std::unordered_map<Key, std::string, KeyHasher> iTable;
;
bool isEqInts(int a, int b)
return a == b;
std::size_t intHashFtn(int x)
std::hash<int> hf;
return hf(x);
int main()
aClass<int> x(isEqInts, intHashFtn);
x.add( 1, std::string("hello") );
我不完全确定如何实现 struct
s Key
和 KeyHasher
以便它们使用类中包含的函数。我真正关心的唯一一件事是函数作为类构造函数的输入。其他一切都可以报废。
【问题讨论】:
【参考方案1】:主要问题是Key
不知道usrIsEq
和KeyHasher
不知道usrHashFtn
。您需要将指向 aClass
对象的指针或引用传递给这些类。
这里有一个建议:
struct Key
O obj;
aClass* ac;
bool operator==(const Key &other) const
std::cout << "obj " << obj << std::endl;
return ac->usrIsEq(obj, other.obj);
;
struct KeyHasher
std::size_t operator()(const Key &k) const
return k.ac->usrHashFtn(k.obj);
;
并更新您使用Key
访问表的位置:
void add(O k, std::string v)
iTable[k, this] = v;
std::string get(O k)
return iTable[k, this];
【讨论】:
嘿,为响应而思考。我之前尝试过一些非常相似的东西,除了我在KeyHasher
中也指向aClass
。效果不太好,因为 KeyHasher
仅供 unordered_map
使用 现在效果很好,你得到了这个。以上是关于使用在内部结构定义中保存函数的类成员变量,这些函数将用作 unordered_map 对象的模板参数的主要内容,如果未能解决你的问题,请参考以下文章