vendredi 17 août 2018

Unable to call member function pointer that is inside a struct

I've been racking my brain over getting the syntax right on declaring, defining and finally calling a member function pointer inside my program.

I'm writing a window manager with Xlib, and am trying to enable the user to define all key bindings in a vector of Keybinds. The Keybind struct contains more member variables, which I have left out here for the sake of brevity.

Here's what I've got so far.

Keybind, a struct containing a member variable, func, that points to an MyClass member function.

struct MyBind {
    MyBind(void (MyClass::*_func)(const XKeyEvent&))
    : func(_func) {}

    void (MyClass::*func)(const XKeyEvent&);
}

Declaration and populating of a vector that holds user-defined Keybinds.

// in my_class.hh
std::vector<MyBind*> my_binds_;

// in my_class.cc, constructor
my_binds_.push_back(new MyBind(Mod1Mask, XK_c, &MyClass::do_this));
my_binds_.push_back(new MyBind(Mod1Mask, XK_j, &MyClass::do_that));

At this point, everything compiles and runs.

Now, when I try to delegate work by iterating over the my_binds_ vector, things go wrong. It is worth noting that I've left out error handling and other member variable accesses for clarity.

void
MyClass::handle_input(const XKeyEvent& e)
{
    for (const MyBind* my_bind: my_binds_) {
        (my_bind->*func)(e); // erroneous line
    }
}

This should be the correct syntax, but it fails to compile, stating error: ‘func’ was not declared in this scope (g++, similar error from clang++).

This is weird to me, as replacing the erroneous line of code with auto test = keybind->func; does compile.

What am I doing wrong? Is there a better way to handle user key bind definitions? Thanks!

Aucun commentaire:

Enregistrer un commentaire