所以,首先,我很犹豫要不要问这个,因为在 SO 上有(基本上)相同的问题,但答案并没有解决我的问题。
我检查过的问题:C++ map<char, static method pointer>?(标记为 How to create class objects dynamically? 的副本,但我没有动态创建对象)
我正在研究 PEG 解析器 (cpp-peglib),并且想将字符串(令牌规则名称)映射到静态函数(解析器函数)。
对于那些不熟悉的人,cpp-peglib 以 [](const SemanticValues& vs) {}
的形式将动作作为 lambda 进行处理。
所以我有一个包含静态方法的结构,这些方法是我的解析器操作,看起来像这样:
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 的静态方法?
答案 0 :(得分:1)
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;
}
答案 1 :(得分:-1)
从 std::function
类型的值到 const SemanticValues&
类型的 T*
的语法是
std::function<T*(const SemanticValues&)>`
可以为该类型分配参数和结果类型正确的任何 lambda、函子或函数指针。