diff --git a/include/sol/stack_push.hpp b/include/sol/stack_push.hpp index 31decd51..0ea89112 100644 --- a/include/sol/stack_push.hpp +++ b/include/sol/stack_push.hpp @@ -37,6 +37,7 @@ #include #if defined(SOL_CXX17_FEATURES) && SOL_CXX17_FEATURES #include +#include #if defined(SOL_STD_VARIANT) && SOL_STD_VARIANT #include #endif // Can use variant @@ -611,7 +612,7 @@ namespace stack { template struct pusher { static int push(lua_State* L, const char (&str)[N]) { - lua_pushlstring(L, str, N - 1); + lua_pushlstring(L, str, std::char_traits::length(str)); return 1; } @@ -890,7 +891,7 @@ namespace stack { template struct pusher { static int push(lua_State* L, const wchar_t (&str)[N]) { - return push(L, str, N - 1); + return push(L, str, std::char_traits::length(str)); } static int push(lua_State* L, const wchar_t (&str)[N], std::size_t sz) { @@ -901,7 +902,7 @@ namespace stack { template struct pusher { static int push(lua_State* L, const char16_t (&str)[N]) { - return push(L, str, N - 1); + return push(L, str, std::char_traits::length(str)); } static int push(lua_State* L, const char16_t (&str)[N], std::size_t sz) { @@ -912,7 +913,7 @@ namespace stack { template struct pusher { static int push(lua_State* L, const char32_t (&str)[N]) { - return push(L, str, N - 1); + return push(L, str, std::char_traits::length(str)); } static int push(lua_State* L, const char32_t (&str)[N], std::size_t sz) { @@ -1028,6 +1029,17 @@ namespace stack { }; #if defined(SOL_CXX17_FEATURES) && SOL_CXX17_FEATURES + template + struct pusher> { + template + static int push(lua_State* L, T&& t) { + if (t == std::nullopt) { + return stack::push(L, nullopt); + } + return stack::push(L, static_cast::value, O&, O&&>>(t.value())); + } + }; + #if defined(SOL_STD_VARIANT) && SOL_STD_VARIANT namespace stack_detail {