Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++11 模板函子的哈希表_C++11_Hashtable_Functor - Fatal编程技术网

C++11 模板函子的哈希表

C++11 模板函子的哈希表,c++11,hashtable,functor,C++11,Hashtable,Functor,我想创建一个hastable to member模板函子,我解释道。 下面是我的例子,它不起作用: #include <iostream> #include <unordered_map> using namespace std; class MyFirstClass { int i_; public: MyFirstClass(): i_(0) {} void setI(int i) { i_ = i; } int getI

我想创建一个hastable to member模板函子,我解释道。 下面是我的例子,它不起作用:

#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;
}
#包括
#包括
使用名称空间std;
我的头等舱
{
国际组织;
公众:
MyFirstClass():i_0{}
void setI(int i){i_u=i;}
int getI(){return i_;}
};
类MySecondClass
{
布尔布尔;
公众:
MySecondClass():b_0{}
void-setB(bool-b){b_=b;}
bool getB(){return b_;}
};
模板
类MyFunctor
{
X&X;
公众:
MyFunctor(X&X):X(X){}
void运算符()()常量{(x.*p)(;}
};
int main(int argc,char*argv[])
{
无序映射myHashTable;
我的头等舱;
我的头等舱;
myHashTable[“int”]=first::setI;
myHashTable[“bool”]=second::setB;
//
string key=“bool”;
int值=1;
myHashTable[键](值);
返回0;
}
我有多个自己的setter类。感谢has表和命令{string,int},我希望能够更改相应类的值


前面的代码暂时不起作用,我被卡住了。

您的代码目前存在一些问题

首先,在您的示例中,
unordered\u map
没有命名类型,因为
MyFunctor
没有命名类型。您可以使用虚拟的
操作符()
创建一个非模板基类,然后让MyFunctor从中继承

其次,您没有使用兼容的方法指针,
MyFirstClass::setI
MySecondClass::setB
都接受一个参数

第三,与第一个相关,当从类模板构造对象时,必须指定模板参数。(直到c++17的类模板演绎指南)。我假设您还有一种不合语法的语法,它试图将对象参数指定给
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;
}
类MyFunctorBase{
虚拟void运算符()(void*i)常量=0;
}
模板
类MyFunctor:公共MyFunctorBase
{
X&X;
公众:
MyFunctor(X&X):X(X){}
void操作符()
};
int main(int argc,char*argv[])
{
无序映射myHashTable;
我的头等舱;
我的头等舱;
myHashTable[“int”]=使_共享(第一);
myHashTable[“bool”]=使_共享(秒);
//
string key=“bool”;
布尔值=真;
(*myHashTable[key])(static_cast(&value));
返回0;
}
或者,更容易的是,使用现有的,为您这样做

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;
}
intmain(intargc,char*argv[])
{
无序映射myHashTable;
我的头等舱;
我的头等舱;
myHashTable[“int”]=[first](void*i){first.setI(*static_cast(i));};
myHashTable[“bool”]=[second](void*i){second.setB(*static_cast(i));};
//
string key=“bool”;
布尔值=真;
myHashTable[key](静态_转换(&value));
返回0;
}

myHashTable[key](值)中的
,你怎么知道值应该是什么类型的呢?我不知道,它可能是整数、双精度或布尔值。我认为用hastable是不可能的,但用functor表可以吗?如果你犯了错误,并试图用
15
调用
setB
,会发生什么?(事实上,这与您在示例中所做的差不多)谢谢您,我将尝试一下。是否可以像这样声明函子:模板类MyFunctor:public MyFunctorBase。对于double和float类型。您可以将其用作参数类型并在模板中展开。是的,您可以为double int float和bool使用common functor?请参见编辑。请注意,
boost::any_cast
在运行时抛出,而不是编译失败,如果类型不匹配,谢谢。我尝试在windows上安装boost,但目前存在问题。我在c++17中看到了任何等价物,但在Qt中我无法设置c++17。