如何手写跨平台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;
}
								
 
  
  
 