1

I have a project that tries to implement keyboard macro scripting with chaiscript. I am writing a class based on xlib to wrap the xlib code. I have a member function to add a modifier key to an ignored list, because of a xlib quirk. how could i do something like the following minimal example.

#include <chaiscript/chaiscript.hpp>
#include <functional>

class MacroEngine{
public:
    MacroEngine() = default;
    //...
    void addIgnoredMod(int modifier){
        ignoredMods |= modifier;
    }
    //...
private:
    int ignoredMods;
};

int main(int argc, char *argv[]){
    MacroEngine me;
    chaiscript::ChaiScript chai;
    //...
    chai.add(chaiscript::fun(std::bind(&MacroEngine::addIgnoredMod, me, std::placeholders::_1)), "setIgnoredMods");
    //...
    return 0;
}

I tried bind and failed with the following error message:

In file included from ../deps/ChaiScript/include/chaiscript/dispatchkit/proxy_functions_detail.hpp:24:0,
                 from ../deps/ChaiScript/include/chaiscript/dispatchkit/proxy_functions.hpp:27,
                 from ../deps/ChaiScript/include/chaiscript/dispatchkit/proxy_constructors.hpp:14,
                 from ../deps/ChaiScript/include/chaiscript/dispatchkit/dispatchkit.hpp:34,
                 from ../deps/ChaiScript/include/chaiscript/chaiscript_basic.hpp:12,
                 from ../deps/ChaiScript/include/chaiscript/chaiscript.hpp:823,
                 from ../src/main.cpp:2:
../deps/ChaiScript/include/chaiscript/dispatchkit/callable_traits.hpp: In instantiation of ‘struct chaiscript::dispatch::detail::Callable_Traits<std::_Bind<void (MacroEngine::*(MacroEngine, std::_Placeholder<1>))(unsigned int)> >’:
../deps/ChaiScript/include/chaiscript/language/../dispatchkit/register_function.hpp:45:72:   required from ‘chaiscript::Proxy_Function chaiscript::fun(const T&) [with T = std::_Bind<void (MacroEngine::*(MacroEngine, std::_Placeholder<1>))(unsigned int)>; chaiscript::Proxy_Function = std::shared_ptr<chaiscript::dispatch::Proxy_Function_Base>]’
../src/main.cpp:21:95:   required from here
../deps/ChaiScript/include/chaiscript/dispatchkit/callable_traits.hpp:99:84: error: decltype cannot resolve address of overloaded function
           typedef typename Function_Signature<decltype(&T::operator())>::Signature Signature;
                                                                                    ^~~~~~~~~
../deps/ChaiScript/include/chaiscript/dispatchkit/callable_traits.hpp:100:86: error: decltype cannot resolve address of overloaded function
           typedef typename Function_Signature<decltype(&T::operator())>::Return_Type  Return_Type;
                                                                                       ^~~~~~~~~~~

I also tried to make the variable static which worked, but it wont work if I try to make it possible to ignore modifiers on a per hotkey basis.

what am i doing wrong? and how can I fix it?

Sam Twidale
  • 1,123
  • 19
  • 16
  • 31

1 Answers1

0

You can do this instead:

chai.add(chaiscript::fun(&MacroEngine::addIgnoredMod, &me), "addIgnoredMod");

Or use a lambda:

chai.add(chaiscript::fun([&me](int modifier){ me.addIgnoredMod(modifier); }), "addIgnoredMod");

Jason Turner, the creator of Chaiscript, commented on it here: http://discourse.chaiscript.com/t/may-i-use-std-bind/244/4

"There’s really never any good reason to use std::bind. I much better solution is to use a lambda (and by much better, I mean much much better. std::bind adds to compile size, compile time and runtime)."

Sam Twidale
  • 1,123
  • 19
  • 16
  • 31