Makro zum Generieren verketteter Sonst-IfsC++

Programme in C++. Entwicklerforum
Guest
 Makro zum Generieren verketteter Sonst-Ifs

Post by Guest »

Verwenden eines X-Makros, um ein paar verschiedene Dinge mithilfe einer außerhalb des Moduls bereitgestellten Liste synchron zu halten.
Ein Teil davon umfasst das Erstellen einer else/if-Kette, um eine Zeichenfolge zu validieren.
Ich mache gerade Folgendes:

Code: Select all

if (0) {
// this will never run, and be compiled out
}
#define X(name) else if (some_thing == #name) { // do thing based on name... }
MY_LIST
#undef X
else {
// Report unrecognized string...
}
aber es fühlt sich für mich ein bisschen hässlich an (ich bin kein großer Fan der nicht ausführbaren Datei if(0) {}).
Ich habe darüber nachgedacht, dies mit einer switch-Anweisung zu tun...

Code: Select all

constexpr hash(const char* const str, size_t len, uint64_t init_value)
// implementation left to imagination of the reader)...

//...

switch(hash(some_thing, len(some_thing))) {
#define X(name) case hash(#name, const_len(#name)): { break; }
MY_LIST
#undef X
default:
{
good_thing = false;
break;
}
}
// Now that it has been validated as a good string... save it etc.
Aber ich mache mir Sorgen wegen Kollisionen (so unwahrscheinlich eine Kollision auch ist).
Gibt es eine Möglichkeit, die if/else-Kette durchzuführen, ohne mit zu beginnen? ein if(0)?
Ich bleibe bei std::14, wenn es hilft (ich weiß, dass es nicht hilft).

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post