We are apologize for the inconvenience but you need to download
more modern browser in order to be able to browse our page

Download Safari
Download Safari
Download Chrome
Download Chrome
Download Firefox
Download Firefox
Download IE 10+
Download IE 10+

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