chaiscript - 将类的非静态成员函数暴露给 chaiscript
问题描述
我有一个项目试图用 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;
^~~~~~~~~~~
我还尝试使变量 static 起作用,但是如果我尝试使在每个热键的基础上忽略修饰符成为可能,它将不起作用。
我究竟做错了什么?我该如何解决?
解决方案
你可以这样做:
chai.add(chaiscript::fun(&MacroEngine::addIgnoredMod, &me), "addIgnoredMod");
或使用 lambda:
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 增加了编译大小、编译时间和运行时)。 "
推荐阅读
- arrays - 在 49 次抽奖中检查一组 6 个号码中的 3 的匹配情况
- firebase - 调用我的 Firebase 函数时出错。TypeError:无法读取 /user_code/node_modules/cors/lib/index.js:219:39 处未定义的属性“来源”
- amazon-web-services - AWS SSM put 参数验证异常
- python - Discord.py 表情符号映射到未定义
- c# - Swift 类型别名的 C# 等效项
- scala - 尽管配置了 logback,但 Play 2.6x Scala 应用程序不记录
- javascript - 如何在反应中修复大树结构
- ios - 如何在 swift/ios 中获取设备设置时间?
- ruby-on-rails - 自定义巫术的 require_login 函数
- java - “。”的目的是什么?范围?