首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将类的非静态成员函数暴露给chaiscript

将类的非静态成员函数暴露给chaiscript
EN

Stack Overflow用户
提问于 2020-04-11 18:07:57
回答 1查看 57关注 0票数 1

我有一个项目,试图实现键盘宏脚本与chaiscript。我正在编写一个基于xlib的类来包装xlib代码。由于xlib的怪癖,我有一个成员函数将修改键添加到一个被忽略的列表中。我怎么能做下面这个最小的例子呢?

代码语言:javascript
复制
#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;
}

我尝试绑定,但失败了,并显示以下错误消息:

代码语言:javascript
复制
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;
                                                                                       ^~~~~~~~~~~

我还试图让变量static起作用,但如果我试图让它可以忽略每个热键上的修饰符,它就不会起作用。

我做错了什么?我怎么才能修复它呢?

EN

回答 1

Stack Overflow用户

发布于 2020-04-12 11:20:20

您可以这样做:

代码语言:javascript
复制
chai.add(chaiscript::fun(&MacroEngine::addIgnoredMod, &me), "addIgnoredMod");

或者使用lambda:

代码语言:javascript
复制
chai.add(chaiscript::fun([&me](int modifier){ me.addIgnoredMod(modifier); }), "addIgnoredMod");

Chaiscript的创建者Jason Turner在这里发表了评论:http://discourse.chaiscript.com/t/may-i-use-std-bind/244/4

“使用std::bind真的没有任何好的理由。我更好的解决方案是使用lambda (更好,我的意思是更好。std::bind增加了编译大小、编译时间和运行时)。”

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61155051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档