#include <iostream>

using FuncPtr = void(*)(int);

void Case_0(int val);
void Case_1(int val);
void Case_2(int val);
void Case_3(int val);
void Case_4(int val);

int main()
{
/*
문제 상황 switch-case분류가 너무 많아!
*/

// 태초에 뭔가 코드가 있었음.
// 코드 실행 결과가 data와 case를 가리키는 정수 target
// 근데 귀찮으니 편의상 data와 target을 지정하자
int data = 100;
int target = 10;

switch (target)
{
case 0:
break;
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
//...
// 이게 너무너무많아!!!!!!!!!!!!!
//...
case 100:
break;
default:
break;
}

// 위 상황을, 함수포인터를 타입으로 갖는 배열을 이용해서 해결할 수 있음
// using FuncPtr = void(*)(int); 로 타입을 지정하고
// 초기화하는 코드들에 일케 넣어주고
FuncPtr funcArr[5];
funcArr[0] = Case_0;
funcArr[1] = Case_1;
funcArr[2] = Case_2;
funcArr[3] = Case_3;
funcArr[4] = Case_4;
// switch-case문을 아래로 대체하면됨.
data = 10;
target = 2;
//target이 배열의 인덱스 허용 범위에서만 되도록 거르긴해야함.
funcArr[target](data);

return 0;
}

void Case_0(int val)
{
std::cout << "Hi~ im case 0 :" << val << std::endl;
}

void Case_1(int val)
{
std::cout <<"Hi~ im case 1 :" << val << std::endl;
}

void Case_2(int val)
{
std::cout << "Hi~ im case 2 :" << val << std::endl;
}

void Case_3(int val)
{
std::cout << "Hi~ im case 3 :" << val << std::endl;
}

void Case_4(int val)
{
std::cout << "Hi~ im case 4 :" << val << std::endl;
}


이게 좀 일반적인 해결방법 같긴한데,

switch 뭐 100개 200개 순서만 맞춰서 쓰면 컴파일러 최적화에 의해서 하나하나씩 비교 안하고 바로 점프 뛰니까

속도가 중요하다 생각하면 걍 switch-case 쓰셈!