这是我的代码。
#include <map>
#include <string>
#include <algorithm>
class maptest {
public:
int doubler(int val) { return val * 2; }
int halver(int val) { return val / 2; }
int negativer(int val) { return val > 0 ? -val : val; }
};
int main() {
const char* const ID[] = {"doubler", "halver", "negativer" };
int ID_SIZE = sizeof(ID) / sizeof(*ID);
//signature of maths functions
typedef int (maptest::*mathfunc)(int);
mathfunc mfuncs[] = { &maptest::doubler, &maptest::halver, &maptest::negativer};
std::map<std::string, mathfunc> mathmap;
for(int i = 0; i < ID_SIZE; ++i) {
mathmap.insert(std::make_pair(ID[i], mfuncs[i]));
}
//C2064: term does not evaluate to a function taking 1 argument
int result = *mathmap["doubler"](3);
return 0;
}
我认为如果没有参数传递给函数,这将有效。但是如何以这种方式传递参数?
答案 0 :(得分:3)
您的mathfunc
是成员函数,因此您需要一个可以调用它们的对象:
maptest mt;
int result = (mt.*(mathmap["doubler"]))(3);
或者,您可以将您的成员函数设置为静态:
class maptest {
public:
static int doubler(int val) { return val * 2; }
static int halver(int val) { return val / 2; }
static int negativer(int val) { return val > 0 ? -val : val; }
};
然后相应地定义mathfunc
:
typedef int (*mathfunc)(int);
这将允许您按照原始帖子中调用它们的方式调用它们:
typedef int (*mathfunc)(int);
请注意,使这种设计更灵活的一种方法是使用std::function
,这将允许您pass any type of callable object。例如:
typedef std::function<int(int)> mathfunc;
mathfunc mfuncs[] = {
&maptest::doubler,
&maptest::halver,
&maptest::negativer,
[] (int i) { return i * 2; } // <== A LAMBDA...
};
答案 1 :(得分:1)
您正在调用非静态成员函数。
执行以下操作。
maptest t;
int (maptest::*tptr) (int) = mathmap["doubler"];
int result = (t.*tptr)(2);
希望这有帮助。