предоставление нестационарной c функции-члена класса в chaiscript - PullRequest
0 голосов
/ 11 апреля 2020

У меня есть проект, который пытается реализовать клавиатурный макрос с использованием chaiscript. Я пишу класс, основанный на xlib, чтобы обернуть код xlib. У меня есть функция-член, чтобы добавить ключ-модификатор в список игнорируемых, из-за причуда xlib. Как я могу сделать что-то вроде следующего минимального примера.

#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;
}

Я попытался связать и потерпел неудачу со следующим сообщением об ошибке:

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;
                                                                                       ^~~~~~~~~~~

Я также попытался сделать переменную stati c который работал, но он не будет работать, если я попытаюсь сделать возможным игнорирование модификаторов для каждой горячей клавиши.

что я делаю неправильно? и как я могу это исправить?

1 Ответ

0 голосов
/ 12 апреля 2020

Вы можете сделать это вместо этого:

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

Или использовать лямбду:

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

Джейсон Тернер, создатель Chaiscript, прокомментировал это здесь: http://discourse.chaiscript.com/t/may-i-use-std-bind/244/4

"На самом деле никогда не бывает веской причины использовать std :: bind. Я намного лучше решил использовать лямбду (и гораздо лучше, я имею в виду гораздо лучше. Добавляет std :: bind). для компиляции размера, времени компиляции и времени выполнения. "

...