Witam,
#include <functional>
#include <iostream>
#include <lua5.2/lua.hpp>
#include <tuple>
// lib
typedef int (*lua_function)(lua_State *L);
void get(lua_State *L, int& value, int index) { value = lua_tonumber(L, index); }
template<int N>
struct pack_
{
template<typename... Args>
static void pack(lua_State* L, std::tuple<Args...>& tuple)
{
typedef typename std::tuple_element<N - 1, std::tuple<Args...>>::type T;
get(L, std::get<N - 1>(tuple), N);
pack_<N - 1>::pack(L, tuple);
}
};
template<>
struct pack_<0>
{
template<typename... Args>
static void pack(lua_State* L, std::tuple<Args...>& tuple) {}
};
template<typename Result, typename... Args>
lua_function reg(Result (*func)(Args...))
{
return [=](lua_State* L) -> int
{
// std::tuple<Args...> arguments;
// enum { N = std::tuple_size<std::tuple<Args...>>::value };
// pack_<N>::pack(L, arguments);
// std::cout << name << std::endl;
// std::cout << 0 << std::endl;
func(1, 2);
return 0;
};
}
// content
void print_sum(int a, int b)
{
std::cout << a + b << std::endl;
}
int lua_print_sum(lua_State* L)
{
int a = lua_tonumber(L, 1);
int b = lua_tonumber(L, 2);
print_sum(a, b);
}
lua_function f = NULL;
template<typename Result, typename... Args>
lua_function r(Result (*func)(Args...))
{
f = reg(func);
}
int main(int argc, char* argv[])
{
lua_State* L = luaL_newstate();
lua_register(L, "lua_print_sum", lua_print_sum);
lua_register(L, "print_sum", reg(print_sum));
const char* buffer = "lua_print_sum(1, 2); print_sum(2, 3)";
if (luaL_loadstring(L, buffer) != 0) {
std::cerr << lua_tostring(L, -1) << std::endl;
return 1;
}
// if (lua_pcall(L, 0, 0, 0) != 0) {
// std::cerr << lua_tostring(L, -1) << std::endl;
// return 1;
// }
r(print_sum);
f(NULL);
lua_close(L);
return 0;
}
Próbuje w dość nie typowy sposób bindować funkcję z C++ do środowiska Lua, ale za bardzo mi to nie wychodzi. Po uruchomieniu aplikacji dostaję o to taki błąd:
#0 0x0000000000400cfc in operator() (this=0x0, L=0x0) at main.cpp:45
#1 0x0000000000400d85 in int (*reg<void, int, int>(void (*)(int, int)))(lua_State*)::{lambda(lua_State*)#1}::_FUN(lua_State*) (L=0x0) at main.cpp:45
#2 0x0000000000400cd5 in main (argc=1, argv=0x7fffffffe698) at main.cpp:94
Próbowałem na bardzo wiele sposób to rozwiązać i nie dałem sobie rady, dlatego Was proszę o pomoc. Nie mogę użyć w środku funkcji lambda użyć funkcji, którą wcześniej podawałem jako argument - mniemam, że to problem z tym że po prostu po wyjściu z tej funkcji dany element nie istnieje - ale nie wiem jak sobie z tym poradzić.
Dziękuje z góry :)