我有一个类成员函数,需要根据整数值调用其他类成员函数,如下所示:
class foo {
public:
foo() {
mTestMap[1] = (*this).test1;
mTestMap[2] = (*this).test2;
mTestMap[3] = (*this).test3;
}
bool test1 () {}
bool test2 () {}
bool test3 () {}
bool execute_test(int test_num) {
if (mTestMap.count(test_num) > 0)
return mTestMap[test_num]();
return false;
}
std::map<int,std::function<bool()>> mTestMap;
};
问题是,此代码导致编译错误:
错误C3867'foo :: test1':非标准语法;使用“&”创建指向成员的指针
我在做什么错?我知道我可以通过指向std::function
的特定对象的指针来分配成员函数。如果地图和作业发生在班级之外,则类似的工作。为什么不从班级内部呢?
答案 0 :(得分:4)
std::function<bool()>
此std::function
包装了一个不带参数的可调用对象,该对象返回一个bool
。这就是这个意思。
bool test1 () {}
您会惊讶地发现这实际上不是一个不带参数的函数,它返回一个bool
。这是一个 类方法 ,它不带任何参数并返回布尔值。巨大差距。因此,编译错误。
正确使用这种调度有两种基本方法:
最简单的方法是使用std::bind
:
mTestMap[1] = std::bind(&foo::test1, this);
mTestMap[2] = std::bind(&foo::test2, this);
mTestMap[3] = std::bind(&foo::test3, this);
对此的一种变体将使用lambda,但这等同于同一件事。这是最简单的更改。但是,如果此类的实例被复制或移动,那么它将非常非常快地向南移动。
使用类方法指针的映射。这需要更多的工作:
std::map<int, bool (foo::*)()> mTestMap;
// ...
mTestMap[1] = &foo::test1;
mTestMap[2] = &foo::test2;
mTestMap[3] = &foo::test3;
// ...
bool execute_test(int test_num) {
if (mTestMap.count(test_num) > 0)
return (this->*mTestMap[test_num])();
return false;
使用这种方法,在复制或移动此类的实例后,意外的惊喜会减少。
答案 1 :(得分:0)
使用std::bind
或lambda:
mTestMap[1] = [](){ return (*this).test1(); };