-2
votes

Pouvez-vous utiliser STD :: Bind (ou quelque chose d'autre) pour changer de type de retour?

dire que j'ai une fonction, xxx pré>

et je veux le transmettre en fonction de la fonction qui retourne et ne prend rien, donc ce serait quelque chose comme: p> xxx pré>

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


7 commentaires

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 . Func_Troking_A_Void_func (void (*) ()) ? 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." , la colle.


@ALFC VOID FUNC_TRAKINK_A_VOID_FUNCUNC (STD :: Fonction ) , 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 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


3 Réponses :


0
votes

Vous ne pouvez pas utiliser std :: lid 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 jamais est.


0 commentaires

0
votes

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));
}


0 commentaires

0
votes

Eh bien l'argument bool entrées_val doit venir de quelque part .

Si vous avez vraiment un drapeau, vous pouvez simplement faire deux fonctions < pré> xxx

et choisir l'un ou l'autre en fonction du drapeau.

sinon BOOL INPUT_VAL doit être une variable globale / thread-locale accessible depuis n'importe où .

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.

Notez que std :: lid ne peut rien capturer et est largement obsolète depuis l'introduction de Lambdas.


0 commentaires