函数指针(类成员函数)的哈希映射

HashMap of Function pointers (Class Member Functions)

本文关键字:函数 哈希 映射 成员 指针      更新时间:2023-10-16

我必须创建一个非常基本的函数指针哈希映射。我的要求只是在其中添加值,然后根据键获取它。出于某种政治原因,我不能使用任何标准的天秤。我有一个工作正常的代码。但是,如果我想要一个指向我的类成员函数的函数指针,那么这不起作用。任何建议应该在下面的代码中进行修改。

在此中,PING 和刷新是独立的函数。所以这段代码有效。但是如果我将这些函数移动到 HashMap 类,那么它就会失败。

法典:--

#include <iostream> 
#include <cstdlib> 
#include <cstring> 
#include <iomanip> 
using namespace std; 
typedef void (*FunctionPtr)(); 
    void ping(){
    cout<<"ping";
}
void refresh(){
    cout<<"refresh";
}
class HashEntry {
private:
    int key;
    FunctionPtr func_ptr1;;
public:
    HashEntry(int key, FunctionPtr fptr) {
        this->key = key;
        this->func_ptr1 = fptr;
    }
    int getKey() {
        return key;
    }
    FunctionPtr getValue() {    
        return this->func_ptr1;
    }
};
const int TABLE_SIZE = 128;
class HashMap {
private:
        HashEntry **table;
public:
        HashMap() {
            table = new HashEntry*[TABLE_SIZE];
            for (int i = 0; i < TABLE_SIZE; i++)
                  table[i] = NULL;
      }
      FunctionPtr get(int key) {
            int hash = (key % TABLE_SIZE);
            while (table[hash] != NULL && table[hash]->getKey() != key)
                  hash = (hash + 1) % TABLE_SIZE;
            if (table[hash] == NULL)
                  return NULL;
            else
                  return table[hash]->getValue();
      }
      void put(int key, FunctionPtr fptr) {
            int hash = (key % TABLE_SIZE);
            while (table[hash] != NULL && table[hash]->getKey() != key)
                  hash = (hash + 1) % TABLE_SIZE;
            if (table[hash] != NULL)
                  delete table[hash];
            table[hash] = new HashEntry(key, fptr);
      }     
      ~HashMap() {
            for (int i = 0; i < TABLE_SIZE; i++)
                  if (table[i] != NULL)
                        delete table[i];
            delete[] table;
      }
};

void main(){
    HashMap* pHashsMap = new HashMap();
    pHashsMap->put(1,ping);
    pHashsMap->put(2,refresh);
    pHashsMap->put(3,ping);
    pHashsMap->put(4,refresh);
    pHashsMap->put(5,ping);
    pHashsMap->put(6,refresh);
    cout<<" Key 1---"<<pHashsMap->get(1)<<endl;
    pHashsMap->get(1)();
    cout<<" Key 5---"<<pHashsMap->get(5)<<endl;
    pHashsMap->get(5)();
    cout<<" Key 3---"<<pHashsMap->get(3)<<endl;
    pHashsMap->get(3)();
    cout<<" Key 6---"<<pHashsMap->get(6)<<endl;
    pHashsMap->get(6)();
    delete pHashsMap;
}

聪明的亚历克答案:检查代码std::bind,从中学习,并创建自己的代码(虽然tbh,不使用STL/boost并不聪明......

更简单的答案:你需要创建一个联合类型来保存你的普通函数指针和一个类成员函数指针,然后存储一个布尔值来指示它是否是一个类指针:

class funcbind_t
{
    union
    {
        void (*pf)();
        void (SomeClass::*mfp)();
    };
    bool member;
    funcbind_t(void (*_pf)()) : pf(_pf), member(false)
    {
    }
    funcbind_t(void (SomeClass::*_mpf)()) : mpf(_mpf), member(true)
    {
    }
    void operator ()()
    {
        if(member)
            mfp();
        else
            fp();
    }
};

如您所见,当您开始需要与函数不同的参数时,这将变得混乱。