Quelle est la raison pour les seconds supports <> dans le modèle de fonction suivante:Fonction Format de spécialisation de modèle
template<> void doh::operator()<>(int i)
Cela est arrivé dans SO question où il a été suggéré qu'il y a des crochets portés disparus après operator()
, mais je pouvais pas trouver l'explication.
Je comprends le sens que si elle était une spécialisation de type (spécialisation complète) de la forme:
template< typename A > struct AA {};
template<> struct AA<int> {}; // hope this is correct, specialize for int
Cependant pour les modèles de fonction:
template< typename A > void f(A);
template< typename A > void f(A*); // overload of the above for pointers
template<> void f<int>(int); // full specialization for int
D'où vient cette forme dans ce scenarion ?:
template<> void doh::operator()<>(bool b) {}
Exemple de code qui semble fonctionner et ne donne aucun rnings/erreur (gcc 3.3.3 utilisé):
#include <iostream>
using namespace std;
struct doh
{
void operator()(bool b)
{
cout << "operator()(bool b)" << endl;
}
template< typename T > void operator()(T t)
{
cout << "template <typename T> void operator()(T t)" << endl;
}
};
// note can't specialize inline, have to declare outside of the class body
template<> void doh::operator()(int i)
{
cout << "template <> void operator()(int i)" << endl;
}
template<> void doh::operator()(bool b)
{
cout << "template <> void operator()(bool b)" << endl;
}
int main()
{
doh d;
int i;
bool b;
d(b);
d(i);
}
Sortie:
operator()(bool b)
template <> void operator()(int i)
La syntaxe ci-dessus de la double parenthèse est très étrange. Normalement, j'ai vu l'opérateur (bool b), mais comment fonctionne operator() (bool b)? Quelle est l'utilisation du premier vide()? – Jimm
@Jimm le nom de la méthode est 'operator()' et il faut un paramètre 'bool b' ... c'est l'opérateur d'appel de fonction. Voir 'main' dans mon exemple de code,' d (b) ' – stefanB