使用在内部结构定义中保存函数的类成员变量,这些函数将用作 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") );

我不完全确定如何实现 structs KeyKeyHasher 以便它们使用类中包含的函数。我真正关心的唯一一件事是函数作为类构造函数的输入。其他一切都可以报废。

【问题讨论】:

【参考方案1】:

主要问题是Key 不知道usrIsEqKeyHasher 不知道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 对象的模板参数的主要内容,如果未能解决你的问题,请参考以下文章

C++ - 在内部,当定义一个类的成员函数时,应该使用成员变量名称还是它的 getter 函数?

一个类能否在内部监控其成员函数的使用和参数

私有变量

php面向对象

类型存储和变量

我可以在Java中的静态成员函数中声明一个静态变量吗?