Me gustaría tener una clase implementar operator()
de diferentes maneras según una opción establecida en la clase. Como esto se llamará una gran cantidad de veces, no quiero usar nada que se ramifique. Idealmente, el operator()
sería un puntero de función que se puede establecer con un método. Sin embargo, no estoy seguro de cómo se vería realmente. Probé:Operador como puntero de función
#include <iostream>
class Test {
public:
int (*operator())();
int DoIt1() {
return 1;
}
int DoIt2() {
return 2;
}
void SetIt(int i) {
if(i == 1) {
operator() = &Test::DoIt1;
} else {
operator() = &Test::DoIt2;
}
}
};
int main()
{
Test t1;
t1.SetIt(1);
std::cout << t1() << std::endl;
t1.SetIt(2);
std::cout << t1() << std::endl;
return 0;
}
Sé que va a funcionar si se crea otro puntero de función y llamar a que a partir de la función operator()
. Pero, ¿es posible que la función operator()
sea un puntero a la función? Algo parecido a lo que publiqué (que no compila)
El código anterior da:
test.cxx:5:21: error: declaration of ‘operator()’ as non-function
test.cxx: In member function ‘void Test::SetIt(int)’:
test.cxx:17:16: error: ‘operator()’ not defined
test.cxx:19:16: error: ‘operator()’ not defined
test.cxx: In function ‘int main()’:
test.cxx:30:19: error: no match for call to ‘(Test)()’
test.cxx:34:19: error: no match for call to ‘(Test)()’
'int (operador())();' ... sintaxis correcta? – iammilind
Hrm, debería ser 'int (* operator())();' Creo, pero eso solo genera un conjunto de otros errores. Editaré el código. – tpg2114
"No quiero usar nada que se ramifique. Idealmente, el operador() sería un puntero a la función" - En realidad, las ramas son mejores para el rendimiento. Las CPU modernas tienen una tasa de éxito superior al 50% al predecir qué rama se tomará; Los punteros de función pueden apuntar a cualquier lugar y, por lo tanto, son mucho más difíciles en la lógica de predicción. – MSalters