Ich hätte gerne eine Klasse implementieren operator()
mehrere verschiedene Möglichkeiten basierend auf einer Option in der Klasse festgelegt. Da dies viele Male aufgerufen wird, möchte ich nichts verwenden, das verzweigt. Im Idealfall wäre der operator()
ein Funktionszeiger, der mit einer Methode eingestellt werden kann. Ich bin mir jedoch nicht sicher, wie das eigentlich aussehen würde. Ich habe versucht:Operator als Funktionszeiger
#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;
}
Ich weiß, es wird funktionieren, wenn ich einen anderen Funktionszeiger erstellen und rufen, dass aus der operator()
Funktion. Aber ist es möglich, dass die Funktion operator()
selbst ein Funktionszeiger ist? Etwas in der Art was ich gepostet habe (was nicht kompiliert)?
Der obige Code gibt:
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 (Operator())();' ... korrekte Syntax? – iammilind
Hrm, sollte es 'int sein (* operator())();' Ich denke, aber das wirft nur eine ganze Reihe von Fehlern. Ich werde den Code bearbeiten. – tpg2114
"Ich möchte nichts verwenden, das verzweigt. Im Idealfall wäre der Operator() ein Funktionszeiger" - Zweige sind eigentlich besser für die Leistung. Moderne CPUs haben eine Erfolgsrate von mehr als 50% bei der Vorhersage, welche Verzweigung genommen wird; Funktionszeiger können überall zeigen und sind daher viel schwieriger für die Vorhersagelogik. – MSalters