vigosslive2@gmail.com wrote:
I wrote a library *eswitch* which provides enhanced functionality for* C++ switch*. Please take a look and leave your comments.
I've had a look at your docs, and I don't immediately find anything that explains how it works. Specifically thinking about strings, there are numerous ways that it could be done. Starting with switch (s) { case "aa" : f(); break; case "ab" : g(); break; case "xy" : h(); break; } that can be transformed into: (1): the obvious sequence of if-else-if: if (s == "aa") f(); else if (s == "ab") g(); else if (s == "xy") h(); (2): binary search using nested switches: switch (s <=> "ab") { case -1: switch (s <=> "aa") { case -1: break; case 0: f(); break; case 1: break; } break; case 0: g(); break; case 1: switch (s <=> "xy") { case -1: break; case 0: h(); break; case 1: break; } break; } (3) character-by-character comparison using nested switches: switch (s[0]) { case 'a': switch (s[1]) { case 'a': switch (s[2]) { case 0: f(); break; } case 'b': switch (s[2]) { case 0: g(); break; } } case 'x': switch (s[1]) { case 'y': switch (s[2]) { case 0: h(); break; } } } (4) converting to a 64-bit integer, for strings of up to 8 characters: switch (cast_to_uint64(s)) { case "aa"TOINT: f(); break; case "ab"TOINT: g(); break; case "xy"TOINT: h(); break; } (5) hashing, and then checking: switch (hash(s)) { case "aa"HASH: if (s=="aa") f(); break; case "ab"HASH: if (s=="ab") g(); break; case "xy"HASH: if (s=="xy") h(); break; } I'm sure there are other possibilities. Regarding syntax, there isn't much wrong with just writing the sequence of if-else-ifs. In particular, when the next person comes along and needs to understand this code, which of the following will they prefer: if (s == "aa") f(); else if (s == "ab") g(); else if (s == "xy") h(); or: eswitch(s) >> case_("aa") >> []{ f(); } >> case_("ab") >> []{ g(); } >> case_("xy") >> []{ h(); }; I can see no benefit to your version, UNLESS it results in a more efficient implementation than the if-else-if version. Regards, Phil.