if you want a switch that works for all datatypes (including structs etc) than you must rebuild a compiler I guess.
But with the trick above you can (re)make a switch like layout for every datatype, you need a element, a copyfunction and a compare function
#define T_SWITCH(X) element _x; elementCopy(_x, X); if (false)
#define T_CASE(X) } else if (elementCmp(_x, X)==0) {
#define T_DEFAULT } else {
Even making switch for structs like {x,y} is possible this way.