C++ map <std::string,static method pointer>?

时间:2021-08-01 15:47:07

标签: c++

所以,首先,我很犹豫要不要问这个,因为在 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 的静态方法?

2 个答案:

答案 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、函子或函数指针。