Bonjour,

Le code suivant me permet de récupérer des pointeurs de fonctions sur le stack lua pour les appeler ensuite. J'utilise enable_if pour différencier le cas où j'attends une fonction qui return void (pas de valeur à return ni à read) d'une fonction qui return quelque chose.
Actuellement, quelque soit la std::function que je demande de lire sur le stack, je reçois :

error: call of overloaded ‘_get(_id<std::function<int(int)> >, lua_State* const&, const int&)’ is ambiguous
Une idée de la raison ?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
template <typename Ret, typename... Args>
 typename std::enable_if<!std::is_void<Ret>::value, std::function<Ret(Args...)> >::type 
  _get(_id<std::function<Ret(Args...)> >, lua_State *l, const int index) 
{
	lua_pushvalue(l, index);
	auto lambda = [l](Args... args) -> Ret {
		//Get the reference
		lua_rawgeti(l, LUA_REGISTRYINDEX, luaL_ref(l, LUA_REGISTRYINDEX));
		State s(l);
		//Push the arguments on the stack
		s.push(args...);
		constexpr int num_args = sizeof...(Args);
		//Call the function
        lua_call(l, num_args, 1);
        Ret ret = s.read<Ret>(-1);
        lua_settop(l, 0);
        return ret;
	};
    return lambda;
}
 
template <typename Ret, typename... Args>
 typename std::enable_if<std::is_void<Ret>::value, std::function<Ret(Args...)> >::type 
 _get(_id<std::function<Ret(Args...)> >, lua_State *l, const int index) 
{
	lua_pushvalue(l, index);
	auto lambda = [l](Args... args) {
		//Get the reference
		lua_rawgeti(l, LUA_REGISTRYINDEX, luaL_ref(l, LUA_REGISTRYINDEX));
		State s(l);
		//Push the arguments on the stack
		s.push(args...);
		constexpr int num_args = sizeof...(Args);
		//Call the function
        lua_call(l, num_args, 1);
        lua_settop(l, 0);
	};
    return lambda;
}
Merci