调用map键来调用需要参数的函数 - 如何工作

时间:2013-05-15 10:31:25

标签: c++ function-pointers

这是我的代码。

#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;
}

我认为如果没有参数传递给函数,这将有效。但是如何以这种方式传递参数?

2 个答案:

答案 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);

希望这有帮助。