C++字符串和成员函数指针的映射表

5

嗨,我正在使用字符串作为键值和成员函数指针作为值来创建一个地图。我似乎无法弄清楚如何向地图中添加内容,以下代码似乎不起作用。

#include <iostream>
#include <map>
using namespace std;

typedef string(Test::*myFunc)(string);
typedef map<string, myFunc> MyMap;


class Test
{
private:
    MyMap myMap;

public:
    Test(void);
    string TestFunc(string input);
};





#include "Test.h"

Test::Test(void)
{
    myMap.insert("test", &TestFunc);
    myMap["test"] = &TestFunc;
}

string Test::TestFunc(string input)
{
}

2
猜测一下,是&Test::TestFunc吗? - chris
似乎修复了参数中的一个错误,但我仍然在插入时遇到错误。 - user1670407
1
@Kosmo 这是因为 insert 不是那样工作的。 - Joseph Mansfield
1
关于insert(),您必须将其转换为正确的类型,即pair<T1 const,T2>,也称为map :: value_type。请具体说明错误。 - Ulrich Eckhardt
这个回答解决了你的问题吗?std::map成员函数指针? - roschach
显示剩余2条评论
1个回答

9
请参阅std::map::insertstd::map以了解有关value_type的信息。
myMap.insert(std::map<std::string, myFunc>::value_type("test", &Test::TestFunc));

针对operator[]运算符

myMap["test"] = &Test::TestFunc;

没有对象时,无法使用成员函数指针。您可以使用类型为Test的对象来使用成员函数指针。

Test t;
myFunc f = myMap["test"];
std::string s = (t.*f)("Hello, world!");

或者使用指向类型 Test 的指针。
Test *p = new Test();
myFunc f = myMap["test"];
std::string s = (p->*f)("Hello, world!");

请参见C++ FAQ - 指向成员函数的指针

+1,尽管因为std::map<A,B>::value_typepair<const A,B>,我更喜欢插入MyMap::value_type(a, b)而不是std::make_pair(a,b),否则你会得到一个pair<A,B>,这必须转换为pair<const A,B>,而该转换无法省略。 - Jonathan Wakely
我只是想知道是否可以将字符串字面量传递给make_pair函数?毕竟,隐含的模板类型是char[5],而不是std::string或其他类似的类型。 - Ulrich Eckhardt
@doomster,它是_const_ char[5],在C++03中,make_pair按值获取其参数,因此数组在参数列表中衰减为指针,在C++11中,返回类型使用std::decay<const char[5]>::type,也会衰减为指针。所以它完美地工作。 - Jonathan Wakely
@doomster 你说得对,这将是一个 std::pair<const char*,...> 而不是 std::pair<std::string,...>。虽然它可以工作,但应该优先选择Jonathan Wakely的版本。 - Olaf Dietsche
谢谢,我明白了。在尝试使用键调用函数时遇到了问题,我尝试了以下方法: convertFunc fu = converters[input]; 或者 map<string, convertFunc>::const_iterator it = converters.find(converter); 并且 return fu(input); 或者 return (*fu)(input); - user1670407
此外,如果您尝试使用非静态函数进行操作,则可以使用以下黑魔法:(this->*f)("你好世界") - david

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接