无序映射:使用类成员函数指针的问题

时间:2018-12-12 17:41:14

标签: c++ function-pointers unordered-map

我有以下问题:我正在编写一个简单的chip8仿真器,并且具有大量的解释器函数,我想通过操作码作为键来访问这些解释器函数,例如字典。那是要替换一个庞大的开关盒,我知道为此目的,无序映射是一个很好的工具。

由于作用域的概念相同,这种方法仅适用于函数(由于它们的静态作用域),因此很容易使用,但不适用于类。我对指针和C ++本身有些陌生,并且不确定如何解决该问题(尝试了很多工作,例如使成员函数静态化,指向该函数的类实例等-这些将无法编译)。即使it .-> second访问也不返回任何内容,即使map.count说该成员存在。

#include <cstdio>
#include <unordered_map>

class test{
public:
    test();
    void fptr(void);
};

void test::fptr(void){
    printf("fptr\n");
}

typedef void (test::*Interpreter)(void);
typedef std::unordered_map<int, Interpreter> fmap;

int main(void){
    fmap map;
    int input = 0;

    map.emplace(1, &test::fptr);

    printf("input int to access:\n");
    scanf("%i", &input);

    auto iter = map.find(input);
    if(iter == map.end() ){
        printf("No such function\n");
    }
    else{
        iter->second; //iter->second() will not compile, accessing like this returns nothing
    }

//checks that the emplaced function actually exists
    for (auto& x: {1}) {
    if (map.count(x)>0){ 
        printf("map has %i\n", x);
    }
    else {
        printf("map has no %i\n", x);
    }

    return 0
}

1 个答案:

答案 0 :(得分:0)

使用标题std::invoke中的functional来执行它(C ++ 17):

test t;
std::invoke(iter->second, t);

毕竟,您需要在一个对象上调用它。该方法本身无法执行。

如果您没有C ++ 17(IIRC):

test t;
(t.*(iter->second))();