首先,我很犹豫要不要问这个问题,因为在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或函数指针。