¿Cuál es la razón de las segundas ménsulas <> en la plantilla de función siguiente:Función
template<> void doh::operator()<>(int i)
Esto ocurrió en SO question donde se sugirió que hay entre paréntesis que faltan después de operator()
, sin embargo pude no encuentras la explicación
entiendo el significado si se tratara de una especialización tipo (completa especialización) de la forma:
template< typename A > struct AA {};
template<> struct AA<int> {}; // hope this is correct, specialize for int
Sin embargo para las plantillas de función:
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ónde encaja esto en este scenarion ?:
template<> void doh::operator()<>(bool b) {}
Código de ejemplo que parece funcionar y no da ningún wa rnings/error (gcc 3.3.3 usado):
#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);
}
Salida:
operator()(bool b)
template <> void operator()(int i)
la sintaxis anterior de doble paréntesis es muy extraña. Normalmente he visto operator (bool b), pero ¿cómo funciona el operador() (bool b)? ¿Cuál es el uso de first empty()? – Jimm
@Jimm el nombre del método es 'operator()' y toma un parámetro 'bool b' ... es el operador de llamada de función. Ver 'main' en mi ejemplo de código,' d (b) ' – stefanB