模板仿函数的哈希 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::setI
和 MySecondClass::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;
}
我想创建一个 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::setI
和 MySecondClass::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;
}