2

这是我的代码。

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

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

4

2 回答 2

3

mathfunc的 s 是成员函数,因此您需要一个对象来调用它们:

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,这将允许您传递任何类型的可调用对象。例如:

typedef std::function<int(int)> mathfunc;

mathfunc mfuncs[] = {
    &maptest::doubler,
    &maptest::halver,
    &maptest::negativer,
    [] (int i) { return i * 2; } // <== A LAMBDA...
    };
于 2013-05-15T10:34:59.283 回答
1

您正在调用非静态成员函数。

请执行下列操作。

 maptest  t;

 int (maptest::*tptr) (int) =  mathmap["doubler"];

 int result =   (t.*tptr)(2);

希望这可以帮助。

于 2013-05-15T10:51:34.320 回答