Passer un prédicat unaire à une fonction en C++
J'ai besoin d'une fonction qui établit une politique pour ma classe pour l'affichage. e.g:
SetDisplayPolicy(BOOLEAN_PRED_T f)
C'est en supposant que BOOLEAN_PRED_T est un fonction du pointeur de la à certains prédicat booléen type:
typedef bool (*BOOLEAN_PRED_T) (int);
Je suis intéressé uniquement sur l'e.g: afficher quelque chose quand passé prédicat est VRAI, ne s'affichent pas lorsque c'est faux.
L'exemple ci-dessus fonctionne pour les fonctions de renvoi booléen et en prenant un int, mais j'ai besoin d'un pointeur générique pour la SetDisplayPolicy argument, alors j'ai pensé à UnaryPredicate, mais il est en augmentation. Comment je peux passer un prédicat unaire à une fonction dans la STL/C++? unary_function< bool,T >
ne fonctionnera pas parce que j'ai besoin d'un bool comme valeur de retour, mais je veux demander à l'utilisateur juste pour "unaire fonction qui retourne bool", dans la plupart approche générique.
J'ai pensé de tirer mon propre type:
template<typename T>
class MyOwnPredicate : public std::unary_function<bool, T>{};
Que cela pourrait être une bonne approche?
Vous devez vous connecter pour publier un commentaire.
Tour
SetDisplayPolicy
dans un modèle de fonction:Puis de l'utiliser, de le faire:
Dans l'affichage de code, vous serait alors d quelque chose comme:
Bien sûr, votre foncteur peut-être besoin d'un état et vous souhaitez peut-être son constructeur à faire des choses, etc. Le point est que
SetDisplayPolicy
ne se soucie pas ce que vous lui donnez (y compris un pointeur de fonction), à condition que vous pouvez coller un appel de fonction sur elle et obtenir unbool
.Edit: Et, comme le csj a dit, vous pourriez hériter de la STL
unary_function
qui fait la même chose et permettra également de vous acheter les deuxtypedef
sargument_type
etresult_type
.Vous êtes sur la bonne voie depuis unary_function est conçu comme une classe de base. Cependant, notez que le premier paramètre est censé être le argument_type et le second est le result_type. Ensuite, tout ce que vous devez faire est de mettre en œuvre l'opérateur()