Bonjour, avec c++0x de gcc 4.5, les MesArgs... ne peuvent êtres capturés dans les lambda.
Pour résoudre ce problème, je les mes dans un tuple avant le lambda et je capture le tuple.
Cependant, quand il faut appeler std::bind(Func, MesArgs...), j'ai quelques problèmes.
J'ai donc fais une fonction qui extrait le tuple et qui renvoie std::bind(Func, MesArgs...);
Il semblerait que le compilateur n'arrive pas à déterminer implicitement le type de retour de ma fonction Bind(Func, tuple);
Est-ce une erreur de ma part ? Un défaut du compilateur ?
Voici le code :
Et,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 std::tuple<ArgsParam...> tuple(param...); return std::function<void(void*)>([&retour, function, tuple](void*Arguments) { auto GodFunc=Binding<Fc,ArgsParam...>::MakeBindingObject(static_cast<Fc>(function), tuple); /*Autres Choses*/ });
Voici l'erreur indiquée par le compilateur :
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
40
41
42 template<unsigned int N, typename Fc, typename ...Args> struct ExtractTuple { template<typename R, typename T, typename ...Finis> inline static R Extract(Fc Func, const std::tuple<Args...>& t, T Obj, Finis...Extracted) { return ExtractTuple<N-1, Fc, Args...>::Extract (static_cast<Fc>(Func), t, std::get<N-1>(t), Extracted...); } }; template<typename Fc, typename ...Args> struct ExtractTuple<0u, Fc, Args...> { template<typename R, typename ...Finis> inline static R Extract(Fc Func, const std::tuple<Args...>& t, Finis... Extracted) { return std::bind(Func, Extracted...); } }; template<unsigned int N, typename Fc> struct ExtractFirst { template<typename R,typename ...Args> inline static R Extract(Fc Func, const std::tuple<Args...>& t) { return ExtractTuple<N-1, Fc, Args...>::Extract (static_cast<Fc>(Func), t, std::get<N-1>(t)); } }; template<typename Fc,typename ...Args> struct Binding { template<typename R> inline static R MakeBindingObject(Fc Func, const std::tuple<Args...>& t) { return ExtractFirst<sizeof...(Args), Fc>::Extract(static_cast<Fc>(Func), t); } };
Après quelques tests, il semblerait que l'erreur soit dû au fait que je ne précise pas explicitement le type de retour de MakeBindingObject.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 instantiated from 'static void std::_Function_handler<void(_ArgTypes ...), _Functor>::_M_invoke(const std::_Any_data&, _ArgTypes ...) [with _Functor = sf::GUI::Evenement<Args>::MakeCallbackWithReturn(R&, Fc, ArgsParam ...) [with R = double, Fc = double (*)(int), ArgsParam = {int}, Args = {double}]::<lambda(void*)>, _ArgTypes = {void*}]'| instantiated from 'std::function<_Res(_ArgTypes ...)>::function(_Functor, typename std::enable_if<(! std::is_integral<_Functor>::value), std::function<_Res(_ArgTypes ...)>::_Useless>::type) [with _Functor = sf::GUI::Evenement<Args>::MakeCallbackWithReturn(R&, Fc, ArgsParam ...) [with R = double, Fc = double (*)(int), ArgsParam = {int}, Args = {double}]::<lambda(void*)>, _Res = void, _ArgTypes = {void*}, typename std::enable_if<(! std::is_integral<_Functor>::value), std::function<_Res(_ArgTypes ...)>::_Usel| instantiated from 'static std::function<void(void*)> sf::GUI::Evenement<Args>::MakeCallbackWithReturn(R&, Fc, ArgsParam ...) [with R = double, Fc = double (*)(int), ArgsParam = {int}, Args = {double}]'| instantiated from here| error: no matching function for call to 'Binding<double (*)(int), int>::MakeBindingObject(double (*)(int), const std::tuple<int>&)'|
Merci d'avance.
Partager