L'idée du code suivant est d'itérer sur un tuple pour appeler une fonction membre ensuite avec les valeurs contenues dans le tuple. Je cherche à rendre le tout compatible dans le cas de fonction qui ne retourne aucune valeur (dans ce cas là, il ne faut pas push de valeur sur le stack lua). Le code ci-dessous ne fonctionne pas, quelque soit la fonction sur laquelle le pointeur pointe, l'implémentation utilisant "push()" est toujours utilisée.
EDIT :
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 template <typename Ret, typename ClassName, typename... Args, std::size_t... N> void callFunctionWithTuple(Ret (ClassName::*fun)(Args...), std::tuple<Args...> args, _indices<N...>) { ClassName * obj = l_CheckClass<ClassName>(1); push((obj->*fun)(std::get<N>(args)...)); } template <typename Ret, typename ClassName, typename... Args, std::size_t... N> void callFunctionWithTuple(void (ClassName::*fun)(Args...), std::tuple<Args...> args, _indices<N...>) { ClassName * obj = l_CheckClass<ClassName>(1); (obj->*fun)(std::get<N>(args)...); } template <typename Ret, typename ClassName, typename... Args> void callFunctionWithTuple(Ret (ClassName::*fun)(Args...), std::tuple<Args...> args) { callFunctionWithTuple(fun, args, typename _indices_builder<sizeof...(Args)>::type()); } template <typename Ret, typename ClassName, typename... Args> void callFunctionWithTuple(void (ClassName::*fun)(Args...), std::tuple<Args...> args) { callFunctionWithTuple(fun, args, typename _indices_builder<sizeof...(Args)>::type()); }
Au cas où quelqu'un chercherait une solution à ce problème, j'ai pu le résoudre en utilisant SFINAE :
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 template <typename Ret, typename ClassName, typename... Args, std::size_t... N> typename std::enable_if<!std::is_void<Ret>::value>::type callFunctionWithTuple(Ret (ClassName::*fun)(Args...), std::tuple<Args...> args, _indices<N...>) { ClassName * obj = l_CheckClass<ClassName>(1); push((obj->*fun)(std::get<N>(args)...)); } template <typename Ret, typename ClassName, typename... Args, std::size_t... N> typename std::enable_if<std::is_void<Ret>::value>::type callFunctionWithTuple(Ret (ClassName::*fun)(Args...), std::tuple<Args...> args, _indices<N...>) { ClassName * obj = l_CheckClass<ClassName>(1); (obj->*fun)(std::get<N>(args)...); }
Partager