Sol2:在C++中调用Lua脚本

Sol2:在C++中调用Lua脚本 本文档记录了在 C++ 代码中使用 sol2 嵌入 Lua 脚本时的一些个人理解。 向Lua中注册自定义用户类型 先看一段代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 sol::state lua; lua.new_usertype<Type>("TypeName", // 类型构造函数 sol::constructors<ConstructFunc1, ConstructFunc2, ...> // 或使用:sol::no_constructor 来禁用 TypeName.new() // 成员变量 "member1", Type.valueptr1, "member2", Type.valueptr2, // 元方法 sol::meta_function::addition, AddFun1, sol::meta_function::substraction, SubFun1, sol::meta_function::multiplication, MultiplicationFun1, // 成员方法 "memberFunc1", MemberFunc1(), "memberFunc2", [](Type& self, /* args... */) { // 对应成员方法的第一个参数 // func... }, ); 这段代码用来向lua脚本中注册一个c++类型,支持一些基本的元方法重载(比如四则运算、比大小、迭代(pair或ipair)等)。 ...

2026-02-02   19分钟   SSmallOrange

技术碎片(持续更新)

Modern C++ Grammar std::ranges std::ranges 库的核心思想是让算法直接操作容器(而非迭代器对),并支持管道式(pipeline)链式调用。 对比以前的迭代器使用方式: 1 2 3 4 5 6 7 // 找到指定元素 std::sort(v.begin(), v.end()); auto it = std::find(v.begin(), v.end(), 4); // std::ranges std::ranges::sort(v); auto it = std::ranges::find(v, 4); 以下是一些std::ranges的常用方式: 转换: std::transform 1 2 3 4 5 6 7 8 9 10 11 12 struct Player { std::string name; int score; }; std::vector<Player> players = {{"Alice", 90}, {"Bob", 75}, {"Carol", 88}}; // 提取所有玩家名字 auto names = players | std::views::transform(&Player::name); // → {"Alice", "Bob", "Carol"}(惰性视图,不拷贝) // 提取分数并乘以 1.1 加权 auto weighted = players | std::views::transform([](const Player& p) { return p.score * 1.1; }); // → {99.0, 82.5, 96.8} 过滤: ...

2025-07-20   29分钟   SSmallOrange