如何手写跨平台range case
老师:那个XXX下课用switch-case写出来字符类型的程序出来啊!
我:哦好的
然后我写了三天
#include <iostream> // recursive driver #define EVAL(...) EVAL4(EVAL256(__VA_ARGS__)) #define EVAL256(...) EVAL64(EVAL64(EVAL64(EVAL64(__VA_ARGS__)))) #define EVAL64(...) EVAL16(EVAL16(EVAL16(EVAL16(__VA_ARGS__)))) #define EVAL16(...) EVAL4(EVAL4(EVAL4(EVAL4(__VA_ARGS__)))) #define EVAL4(...) EVAL1(EVAL1(EVAL1(EVAL1(__VA_ARGS__)))) #define EVAL1(...) __VA_ARGS__ #define EMPTY(...) #define DEFER(...) __VA_ARGS__ EMPTY() // termination resolver(stub) #define CONCAT(a,b) a##b //for gcc/g++ typedef void(*RANGECASEFUN)(int, int, int, int); void rangeCaseStub(int, int, int, int){} RANGECASEFUN CONCAT(_RANGE, _CASE)() { return rangeCaseStub; } //for vc void CONCAT(EXEC_RANGE,_CASE)(int,int,int,int){} // real worker - case generator // will produce lots of junk cases // but it's okay if compiler optimization enabled :P #define _RANGE_CASE() EXEC_RANGE_CASE // start to end (edge included) // delta is for resolving the "case already exists" problem // buf stores the generated expression #define EXEC_RANGE_CASE(start, end, delta, buf) case (buf < end ? buf : (delta+buf)):\ DEFER(_RANGE_CASE)()(start,end,delta, buf + 1) #define RANGE_CASE(start, end, delta) EVAL(EXEC_RANGE_CASE(start, end, delta, start)); int main() { char c = 0; std::cin >> c; switch (c) { RANGE_CASE('A', 'Z',1000) std::cout << "Uppercase Letter"; break; RANGE_CASE('a', 'z',2000) std::cout << "Lowercase Letter"; break; RANGE_CASE('0', '9', 3000) std::cout << "Digits"; break; }; return 0; }