Bindowanie funkcji w Lua

0

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 :)

0

Jest jakiś głębszy sens tych wszystkich kombinacji czy po prostu zadałeś sobie problem natury teoretycznej?

0

zobacz sobie jak tutaj to robia

https://github.com/moai/moai-dev

1 użytkowników online, w tym zalogowanych: 0, gości: 1