Myślę, że problem jest dość powszechny. Masz ciąg wejściowy i musisz wywołać funkcję w zależności od zawartości napisu. Coś jak przełącznik() dla łańcuchów. Pomyśl o opcjach wiersza poleceń.Poszukuję najbardziej eleganckiego dyspozytora kodów
Obecnie używam:
using std::string;
void Myclass::dispatch(string cmd, string args) {
if (cmd == "foo")
cmd_foo(args);
else if (cmd == "bar")
cmd_bar(args);
else if ...
...
else
cmd_default(args);
}
void Myclass::cmd_foo(string args) {
...
}
void Myclass::cmd_bar(string args) {
...
}
aw nagłówku
class Myclass {
void cmd_bar(string args);
void cmd_foo(string args);
}
Więc każdy foo i bar muszę powtórzyć cztery (4!) Razy. Wiem, że mogę podawać wskaźniki funkcyjne i łańcuchy do statycznej tablicy przed i wykonuję dyspozycję w pętli, oszczędzając niektóre, jeśli ... inne linie. Ale czy istnieje jakieś makro oszustwo (lub nadużycie preprocesora, w zależności od POV), które pozwala w jakiś sposób zdefiniować funkcję i jednocześnie automatycznie aktualizować tablicę? Więc musiałbym napisać to tylko dwa razy, a może raz, jeśli jest używany inline?
Szukam rozwiązania w C lub C++.
To pytanie było wielokrotnie zadawane, a odpowiedź była mi przeze mnie http://stackoverflow.com/questions/659581/replace-giant-switch-statement-with-what –
On także prosi o jakiś schemat rejestracyjny do zmniejszyć wysiłek w utrzymaniu słownika. – djna
Jest, ale nie sądzę, żeby był taki, który by go usatysfakcjonował. Możesz zrobić coś surowego i brzydkiego z makrami, ale to więcej kłopotów niż jest warte. –