模板仿函数的哈希 table

Hash table of templated functor

我想创建一个 hastable 成员模板仿函数,我解释一下。 这是我的例子,它不起作用:

#include <iostream>    
#include <unordered_map>

using namespace std;
class MyFirstClass
{
    int i_;

public:
    MyFirstClass(): i_(0) {}

    void setI(int i) { i_ = i; }
    int getI() { return i_; }
};

class MySecondClass
{
    bool b_;

public:

    MySecondClass(): b_(0) {}

    void setB(bool b) { b_ = b; }
    bool getB() { return b_; }
};

template<class X, void (X::*p)()>
class MyFunctor
{
    X& _x;
public:
    MyFunctor(X& x) : _x( x ) {}
    void operator()() const { (_x.*p)(); }
};

int main(int argc, char *argv[])
{
    unordered_map<string,MyFunctor> myHashTable;

    MyFirstClass first;
    MyFirstClass second;

    myHashTable["int"] = first::setI;
    myHashTable["bool"] = second::setB;

    //
    string key = "bool";
    int value = 1;

    myHashTable[key](value);

    return 0;
}

我有多个 class 和他们自己的 setter 。我希望能够感谢 has table 和命令 {string,int} 更改相应 class.

的值

之前的代码暂时不起作用,卡住了。

就目前而言,您的代码存在一些问题。

首先,根据您的示例 unordered_map<string,MyFunctor> 没有命名类型,因为 MyFunctor 没有命名类型。您可以创建一个带有虚拟 operator() 的非模板基 class,然后让 MyFunctor 继承它。

其次,您没有使用兼容的方法指针,MyFirstClass::setIMySecondClass::setB 都带有一个参数。

第三,与第一个相关,从class模板构造对象时必须指定模板参数。 (直到 c++17 的 class 模板推导指南)。你也有不合语法的语法,我假设它试图在方法指针模板参数旁边指定 MyFunctor 构造函数的对象参数。

你会有这样的东西

class MyFunctorBase {
    virtual void operator()(void * i) const = 0;
}

template<class T, class X, void (X::*p)(T)>
class MyFunctor : public MyFunctorBase 
{
    X& _x;
public:
    MyFunctor(X& x) : _x( x ) {}
    void operator()(void * i) const override { (_x.*p)(*static_cast<T*>(i)); }
};

int main(int argc, char *argv[])
{
    unordered_map<string,shared_ptr<MyFunctorBase>> myHashTable;

    MyFirstClass first;
    MyFirstClass second;

    myHashTable["int"] = make_shared<MyFunctor<int, MyFirstClass, &MyFirstClass::setI>>(first);
    myHashTable["bool"] = make_shared<MyFunctor<bool, MySecondClass, &MySecondClass::setB>>(second);


    //
    string key = "bool";
    bool value = true;

    (*myHashTable[key])(static_cast<void *>(&value));

    return 0;
}

或者,更容易的是,使用现有的 std::function,它会为您做到这一点

int main(int argc, char *argv[])
{
    unordered_map<string,function<void(void *)>> myHashTable;

    MyFirstClass first;
    MyFirstClass second;

    myHashTable["int"] = [first](void * i) { first.setI(*static_cast<int *>(i)); };
    myHashTable["bool"] = [second](void * i) { second.setB(*static_cast<bool *>(i)); };


    //
    string key = "bool";
    bool value = true;

    myHashTable[key](static_cast<void *>(&value));

    return 0;
}