extern "C" { extern int memcmp (const void *__s1, const void *__s2, long unsigned int __n) throw (); } struct StringRef { const char *data () const { } }; template < typename T, typename R = T > class StringSwitch { StringRef Str; public: explicit StringSwitch (StringRef Str):Str (Str) { } template < unsigned N > StringSwitch & Case (const char (&S)[N]) { memcmp (S, Str.data (), N - 1); } R Default () const { } }; int getIt (StringRef Name) { return StringSwitch < int > (Name) .Case ("unknown") .Default (); }