You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写C++宏实现sol库绑定Lua类时C++与Lua函数名自动一致?

SOL 类绑定宏实现方案

可行性说明

完全可以实现,核心借助C/C预处理器的字符串化运算符#、可变参数宏、循环展开宏三个特性,即可自动生成指定类名、对应成员函数的绑定代码,完全保证Lua侧键名和C侧函数名一致,避免手动拼写错误。

宏实现代码

以下为纯标准预处理器实现,不需要引入任何第三方依赖,默认最多支持绑定64个成员函数,可按需扩展上限:

// 辅助宏:处理单个函数的绑定逻辑
#define SOL_BIND_ONE_FUNC(bind_obj, class_name, func_name) \
    bind_obj[#func_name] = &class_name::func_name;

// 可变参数遍历辅助宏
#define SOL_MACRO_GET_OVERRIDE(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,NAME,...) NAME
#define SOL_BIND_FOREACH_HELPER_0(func, bind_obj, class_name)
#define SOL_BIND_FOREACH_HELPER_1(func, bind_obj, class_name, a) func(bind_obj, class_name, a)
#define SOL_BIND_FOREACH_HELPER_2(func, bind_obj, class_name, a, b) func(bind_obj, class_name, a) func(bind_obj, class_name, b)
#define SOL_BIND_FOREACH_HELPER_3(func, bind_obj, class_name, a, b, c) func(bind_obj, class_name, a) func(bind_obj, class_name, b) func(bind_obj, class_name, c)
#define SOL_BIND_FOREACH_HELPER_4(func, bind_obj, class_name, a, b, c, d) func(bind_obj, class_name, a) func(bind_obj, class_name, b) func(bind_obj, class_name, c) func(bind_obj, class_name, d)
// 若需要绑定更多函数,可按上述规律继续补充SOL_BIND_FOREACH_HELPER_N定义

#define SOL_BIND_FOREACH(bind_obj, class_name, func, ...) \
    SOL_MACRO_GET_OVERRIDE(__VA_ARGS__, \
    SOL_BIND_FOREACH_HELPER_64,SOL_BIND_FOREACH_HELPER_63,SOL_BIND_FOREACH_HELPER_62,SOL_BIND_FOREACH_HELPER_61,SOL_BIND_FOREACH_HELPER_60, \
    SOL_BIND_FOREACH_HELPER_59,SOL_BIND_FOREACH_HELPER_58,SOL_BIND_FOREACH_HELPER_57,SOL_BIND_FOREACH_HELPER_56,SOL_BIND_FOREACH_HELPER_55, \
    SOL_BIND_FOREACH_HELPER_54,SOL_BIND_FOREACH_HELPER_53,SOL_BIND_FOREACH_HELPER_52,SOL_BIND_FOREACH_HELPER_51,SOL_BIND_FOREACH_HELPER_50, \
    SOL_BIND_FOREACH_HELPER_49,SOL_BIND_FOREACH_HELPER_48,SOL_BIND_FOREACH_HELPER_47,SOL_BIND_FOREACH_HELPER_46,SOL_BIND_FOREACH_HELPER_45, \
    SOL_BIND_FOREACH_HELPER_44,SOL_BIND_FOREACH_HELPER_43,SOL_BIND_FOREACH_HELPER_42,SOL_BIND_FOREACH_HELPER_41,SOL_BIND_FOREACH_HELPER_40, \
    SOL_BIND_FOREACH_HELPER_39,SOL_BIND_FOREACH_HELPER_38,SOL_BIND_FOREACH_HELPER_37,SOL_BIND_FOREACH_HELPER_36,SOL_BIND_FOREACH_HELPER_35, \
    SOL_BIND_FOREACH_HELPER_34,SOL_BIND_FOREACH_HELPER_33,SOL_BIND_FOREACH_HELPER_32,SOL_BIND_FOREACH_HELPER_31,SOL_BIND_FOREACH_HELPER_30, \
    SOL_BIND_FOREACH_HELPER_29,SOL_BIND_FOREACH_HELPER_28,SOL_BIND_FOREACH_HELPER_27,SOL_BIND_FOREACH_HELPER_26,SOL_BIND_FOREACH_HELPER_25, \
    SOL_BIND_FOREACH_HELPER_24,SOL_BIND_FOREACH_HELPER_23,SOL_BIND_FOREACH_HELPER_22,SOL_BIND_FOREACH_HELPER_21,SOL_BIND_FOREACH_HELPER_20, \
    SOL_BIND_FOREACH_HELPER_19,SOL_BIND_FOREACH_HELPER_18,SOL_BIND_FOREACH_HELPER_17,SOL_BIND_FOREACH_HELPER_16,SOL_BIND_FOREACH_HELPER_15, \
    SOL_BIND_FOREACH_HELPER_14,SOL_BIND_FOREACH_HELPER_13,SOL_BIND_FOREACH_HELPER_12,SOL_BIND_FOREACH_HELPER_11,SOL_BIND_FOREACH_HELPER_10, \
    SOL_BIND_FOREACH_HELPER_9,SOL_BIND_FOREACH_HELPER_8,SOL_BIND_FOREACH_HELPER_7,SOL_BIND_FOREACH_HELPER_6,SOL_BIND_FOREACH_HELPER_5, \
    SOL_BIND_FOREACH_HELPER_4,SOL_BIND_FOREACH_HELPER_3,SOL_BIND_FOREACH_HELPER_2,SOL_BIND_FOREACH_HELPER_1,SOL_BIND_FOREACH_HELPER_0) \
    (func, bind_obj, class_name, ##__VA_ARGS__)

// 最终对外使用的SOL_BIND宏
#define SOL_BIND(class_name, ...) \
    do { \
        auto bind = state_->new_usertype<class_name>(#class_name); \
        SOL_BIND_FOREACH(bind, class_name, SOL_BIND_ONE_FUNC, ##__VA_ARGS__); \
    } while(0)

使用方式

调用时所有函数名用逗号分隔即可,和你预期的写法基本一致:

SOL_BIND(Class1,
    Function1,
    Function2,
    Function3,
    Function4
);

展开后和你给出的示例代码完全一致。

注意事项

  • 如果类中有重载的成员函数,不能直接用上述宏绑定,需要显式指定函数签名后绑定,此时建议单独写绑定语句,避免宏自动推导错误。
  • 上述宏默认你当前作用域可以访问到state_变量(即sol的state实例指针),如果变量名不同,修改宏里的state_为你实际的变量名即可。
  • 宏里的do while(0)是为了保证宏在各种语法场景(比如if分支后无大括号)下都能正常工作,不会出现语法错误。
  • 如果需要绑定超过64个成员函数,按照相同规律补充SOL_BIND_FOREACH_HELPER_N的定义即可。

内容的提问来源于stack exchange,提问作者GeeRoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:06:04