#define SOL_CHECK_ARGUMENTS 1 #include #include #include #include struct number_shim { double num = 0; }; namespace sol { template <> struct lua_type_of : std::integral_constant {}; namespace stack { template <> struct checker { template static bool check(lua_State* L, int index, Handler&& handler, record& tracking) { // check_usertype is a backdoor for directly checking sol2 usertypes if (!check_usertype(L, index) && !stack::check(L, index)) { handler(L, index, type_of(L, index), type::userdata, "expected a number_shim or a number"); return false; } tracking.use(1); return true; } }; template <> struct getter { static number_shim get(lua_State* L, int index, record& tracking) { if (check_usertype(L, index)) { number_shim& ns = get_usertype(L, index, tracking); return ns; } number_shim ns{}; ns.num = stack::get(L, index, tracking); return ns; } }; } // namespace stack } // namespace sol int main() { sol::state lua; // Create a pass-through style of function lua.safe_script("function f ( a ) return a end"); lua.set_function("g", [](double a) { number_shim ns; ns.num = a; return ns; }); lua.script("vf = f(25) vg = g(35)"); number_shim thingsf = lua["vf"]; number_shim thingsg = lua["vg"]; assert(thingsf.num == 25); assert(thingsg.num == 35); return 0; }