Foncteur c ++ et modèles de fonctions
considérer cette simple et inutile de code.
#include <iostream>
struct A {
template<int N>
void test() {
std::cout << N << std::endl;
}
};
int main() {
A a;
a.test<1>();
}
C'est un exemple très simple d'un modèle de fonction. Si toutefois, j'ai voulu remplacer A::test
avec une surcharge operator()
pour en faire un foncteur?
#include <iostream>
struct A {
template<int N>
void operator()() {
std::cout << N << std::endl;
}
};
int main() {
A a;
a<1>(); //<-- error, how do I do this?
}
Certainement si le operator()
a pris des paramètres qui étaient à la charge sur le modèle, le compilateur pourrait éventuellement en déduire le modèle. Mais je ne peux pas trouver la bonne syntaxe pour spécifier les paramètres de modèle avec un sans paramètre foncteur.
Est-il une bonne façon de le faire?
Évidemment, ce code devrait marcher, car il contourne le foncteur syntaxe:
a.operator()<1>();
mais qui a plutôt l'emporte sur l'objectif d'être un foncteur :-P.
source d'informationauteur Evan Teran
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas un autre "direct" façon je sais que d'autres que l':
de la syntaxe. Si vous êtes disposé à modifier le code, le déplacement du paramètre de modèle à la classe, ou à l'aide d'un (boost|tr1)::bind pour faire un (boost|tr1)::la fonction de l'objet.
Vous pouvez uniquement appeler
mais ce ne serait pas à l'aide d'un foncteur. Foncteurs besoin d'un modèle non de l'opérateur(), qu'ils doivent être en mesure d'être appelé comme varname() et qui ne fonctionnera pas avec votre code.
Pour en faire un véritable foncteur de changement de votre code d'une classe de modèle (foncteurs sont des classes):
Vous essayez de passer un paramètre de modèle à une instance d'un objet, qui, autant que je sais, c'est pas permis. Vous ne pouvez passer à des modèles de paramètres de modèle des fonctions ou des objets de modèle.
un.test<1>(); et un.opérateur()<1>(); travail parce qu'ils servent de modèle de fonctions.
Utiliser boost::bind (découvrez bibliothèques boost) pour bien fixer.
Et vous n'avez même pas à jouer avec les modèles de!
Vous êtes coincé. Avez-vous pensé à quelque chose comme
Non, il n'y a pas moyen de contourner cela. Comme vous l'avez dit, vous devez appeler l'opérateur explicitement (ce qui est contraire au but), ou les arguments de modèle doit pouvoir être déduit par le compilateur.