Hallo,
folgender Hintergrund: ich schreibe gerade ein Programm, das durch einen Text iteriert und die Wörter ausgeben soll, die nicht in einer (zuvor erstellten) Datenbank vorhanden sind. Dazu muss ich von jedem Wort erst einmal versuchen, die Grundform zu bilden. Es gibt eine Enumeration, die alle Wortarten enthält. Hier mal eine verkürzte Variante:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
|
class WordClass
{
public:
// ...
enum Type : unsigned char
{
NOUN,
VERB,
ADJECTIVE
}
// ...
}
|
Nun gibt's noch eine andere Klasse namens WordIdentifier, die unter anderem die Methode
bool identify(const std::string&, WordClass::Type) const; enthält.
Ich übergebe also einen String, der das unveränderte Wort aus dem Text erhält, und den Typ des Wortes, mithilfe dessen die Grundform gebildet werden soll.
Rückgabewert ist dann, ob das Wort in der Datenbank ist oder nicht.
Jetzt frage ich mich, wie ich diese Methode implementieren soll.
Möglichkeit 1: Sie besteht aus einer riesigen (dadurch unübersichtlichen) switch-Anweisung, je nach WordClass::Type.
Möglichkeit 2: Sie ruft je nach WordClass::Type eine (am besten
private) Methode auf, wodurch ich aber in der Header-Datei ziemlich viele Zeilen ähnlichen Aussehens (also z.B. identifyNoun(...), identifyVerb(...), ...) hätte. Finde ich genauso unschön wie Möglichkeit 1.
Möglichkeit 3: Mithilfe von Templates, ungefähr so:
|
C-/C++-Quelltext
|
1
2
|
template<WordClass::Type>
bool identify(const std::string&) const;
|
Dann könnte ich jeden WordClass::Type spezialisieren. Allerdings werden die WordClass::Type's erst zur Laufzeit bestimmt, weshalb ich nicht sowas wie
|
C-/C++-Quelltext
|
1
2
3
|
// ...
return identify<getWordType()>(str);
// ...
|
schreiben kann. Das müsste dann wohl wieder eine switch-Anweisung à la
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
switch(getWordType())
{
case NOUN: return identify<NOUN>(str);
case VERB: return identify<VERB>(str);
// ...
}
|
werden.
Ist zwar schon besser (m.M.n.), aber gefällt mir immer noch nicht.
Meine Frage: welche Möglichkeit würdet ihr bevorzugen, bzw. (noch besser) kennt ihr elegantere Möglichkeiten, so etwas zu implementieren?
Gruß,
Phi239