C++映射<std::string,静态方法指针>?



首先,我很犹豫要不要问这个问题,因为在So上(基本上)有同样的问题,但是答案并没有解决我的问题。

问题我检查过:c++ map<char,静态方法指针>?(标记为副本如何动态创建类对象?但我没有动态创建对象)

我正在研究PEG解析器(pcp -peglib),并希望将字符串(令牌规则名称)映射到静态函数(解析器函数)。

对于那些不熟悉的人来说,pcp -peglib以lambda的形式执行操作,形式为[](const SemanticValues& vs) {}

所以我有一个包含静态方法的结构,这些方法是我的解析器动作,看起来像这样:
struct T {
static auto getParser_A() {
return [](const SemanticValues& vs) {/* return parsed token*/};
}
static auto getParser_B() {
return [](const SemanticValues& vs) {/* return parsed token*/};
}
};

我想将操作映射到规则的名称,类似于:

std::map<std::string,/* static method reference */> actionMap

这样我就可以添加如下规则:

parser[RULE_NAME] = actionMap[RULE_NAME];

我已经试过了:

map<string,function<T*>> mapping;

:

typedef T* (*action)();
map<string,action> mapping;

但我得到could not convert ‘{{"A", T::getParser_A}, {"B", T::getParser_B}}’ from ‘’ to ‘std::map, std::function >’两个版本。

我做错了什么?如何在映射中存储返回lambda的静态方法?

getParser_A返回lambda,类似于指向函数的指针。因此,指向getPArser_A的指针是指向返回函数的函数的指针。您可以将其存储在map中。我假设下面的函数返回一个int

#include <map>
#include <vector>
#include <functional>
#include <string>
struct SemanticValues {};
struct T {
static auto getParser_A() {
return [](const SemanticValues& vs) {
return 1;
};
}
static auto getParser_B() {
return [](const SemanticValues& vs) {
return 2;
};
}
};
int main() {
std::map<std::string, 
// Function that returns a function that returns an int and takes SemanticValues
std::function<std::function<int (const SemanticValues& vs)> ()> > m;
m["A"] = T::getParser_A;
m["B"] = T::getParser_B;
}

从类型为const SemanticValues&到类型为T*std::function的语法为

std::function<T*(const SemanticValues&)>`

该类型可以赋值给任何实参和结果类型正确的lambda、functor或函数指针。

最新更新