2011-01-05 1 views
1

J'ai quelque chose comme un algorithme de tri ici, et je veux lui passer un foncteur, qui fournit les critères de tri (std :: fonction binaire). Il devrait donc appeler T.operator <() par exemple si std :: less est donné.Comment passer un std-foncteur en C++ et l'utiliser sans savoir lequel il est spécifiquement

Le problème est que l'opérateur de fonction membre() n'est pas virtuel. J'ai donc besoin de savoir quel type d'objet a été donné, d'effectuer un casting dynamique qui n'est pas vraiment sympa.

Regards,

Dennis

Répondre

6

Le problème est, l'opérateur de la fonction membre() est non virtuelle. J'ai donc besoin de savoir quel type d'objet a été donné, d'effectuer un casting dynamique qui n'est pas vraiment sympa.

Pourquoi voulez-vous effectuer une distribution dynamique? Normalement, vous n'avez pas besoin de ça. Il suffit d'appeler le operator() du foncteur comme si vous appeliez une fonction normale.

Tout le point d'un foncteur est qu'il se comporte comme des fonctions normales et que vous passez un paramètre de modèle dans votre algorithme (n'est-ce pas?) Pour gérer différents types de foncteurs (et de fonctions).

Bien sûr, tout cela est basé sur le fait que est en passant réellement un paramètre de modèle dans votre fonction. std::binary_function est pas adapté en tant que classe de base virtuelle. Il existe simplement pour définir quelques typedefs pratiques. Ainsi, votre déclaration de fonction devrait ressembler à ceci:

template <typename TBinaryFunction> 
void your_algorithm(rest of parameters …, TBinaryFunction f); 
+0

Je ne veux pas utiliser dynamic_cast ... mais je ne peux pas non plus utiliser operator() car dans le contexte local, c'est binary_function qui n'a pas d'opérateur() défini. vous devez le surcharger d'abord pour l'utiliser ... – Dennis

+2

@Dennis: alors vous utilisez abusivement 'binary_function'. Comme je l'ai dit dans ma réponse, il n'a jamais été conçu pour agir comme une classe de base polymorphe. Il définit simplement quelques typedefs utiles, rien de plus. Vous ne pouvez pas passer de façon significative une 'fonction_binaire 'dans une autre fonction, cela n'est pas supposé fonctionner. –

+0

ok merci de me donner un exemple? (link?) J'avais l'intention d'utiliser binary_function comme une superclasse non spécifiée afin que chaque foncteur de comparaison de la STL puisse être utilisé ... je ne comprends pas vraiment comment utiliser un template ici. – Dennis

0

Vous pouvez utiliser Qt signal et machines à sous ou vous pouvez utiliser Boost.Function

1

Tu ne peux pas passer votre foncteur en tant que paramètre de modèle, afin d'avoir polymorphisme statique?

+0

Assez sûr que cette utilisation particulière des modèles n'est pas un polymorphisme statique. – Puppy

Questions connexes