dire que j'ai une fonction, et je veux le transmettre en fonction de la fonction qui retourne et ne prend rien, donc ce serait quelque chose comme: p> J'ai d'abord essayé d'utiliser std :: lid code>, mais naturellement, le compilateur n'a pas pu utiliser
my_func code> puisqu'il renvoya BOOL Vide. P>
func_taking_a_void_func(std::bind(my_func, the_truth));
3 Réponses :
Vous ne pouvez pas utiliser std :: lid code> ou un lambda qui capture une variable pour la transmettre à une fonction qui attend un pointeur de fonction. Les Lambdas sont convertibles aux pointeurs de fonction lorsqu'ils ne capturent aucune variable; Le résultat de
std :: lid code> jamais est. p>
Ce n'est pas clair ce que c'est votre problème, mais de toute façon, cela n'utilise pas la Lambda.
#include<type_traits> template<class F> struct adapt{ bool arg_; F f_; adapt(bool arg, F f) : arg_{arg}, f_{f}{} void operator()() const{f_();} }; template<class F> adapt<F> make_adapt(bool b, F f){return adapt<F>(b, f);} template<class F> int func_taking_a_void_func(F&& f){ static_assert(std::is_same<decltype(f()), void>{}, "!"); return 5; } bool my_func(bool input_val) { return !input_val; } int main(){ bool the_truth = true; func_taking_a_void_func(make_adapt(the_truth, my_func)); }
Eh bien l'argument Si vous avez vraiment un drapeau, vous pouvez simplement faire deux fonctions p> < pré> xxx pré> et choisir l'un ou l'autre en fonction du drapeau. p> sinon Vous ne pouvez pas utiliser la capture de Lambda, ce faisant ainsi ferverait la Lambda d'une fonction en structure. Mais si les solutions ci-dessus ne vous aident pas, la seule façon d'y aller est de travailler avec des foncteurs au lieu de fonctions de fonction. P> Notez que bool entrées_val code> doit venir de quelque part em>.
BOOL INPUT_VAL code> doit être une variable globale / thread-locale accessible depuis n'importe où . P>
std :: lid code> ne peut rien capturer et est largement obsolète depuis l'introduction de Lambdas. p> p>
Quel est le problème avec la fonction Lambda?
J'ai déjà jeté ma supposition, mais "le compilateur dit quelque chose à propos de la fonction renvoyant une valeur, et que je ne puisse pas convertir" n'est pas suffisamment détaillé pour une réponse fiable. Lorsque vous recherchez de l'aide pour une erreur de compilateur, vous devez toujours publier un extrait autonome qui reproduit votre problème et vous devez toujours afficher l'erreur exacte que vous obtenez lorsque vous essayez de le construire.
Quelle est la signature de
func_tacking_a_void_func code>.
Func_Troking_A_Void_func (void (*) ()) code>? S'il vous plaît poster le code de travail.
Veuillez fournir un exemple de reproductible minimal . "dit quelque chose à propos de la fonction renvoyant une valeur et que je ne parviens pas à convertir." I>, la colle.
@ALFC
VOID FUNC_TRAKINK_A_VOID_FUNCUNC (STD :: Fonction) CODE>, j'aurais dû y avoir ceci en premier, merci!
@zneak Je ne cherchais pas de l'aide avec une erreur de compilateur autant que j'essayais de déterminer pour éviter d'utiliser une Lambda pour ce
func_taking_a_void_func code> appel. J'ai fourni la ligne STD :: Bind Line pour montrer que STD :: Bind ne fonctionne pas, plutôt que d'obtenir de l'aide pour résoudre cette erreur.
@Alfc Aucun problème réel, ne se demandait que s'il y avait une alternative