2016-12-14 4 views
0

이 같은 일부 코드가있는 경우 :템플릿 기능이있는 경우-else 문을 피

void function_1(...) 
{ 
    //do something 
} 


void function_2(...) 
{ 
    //do something 
} 


int function_3(...) 
{ 
    //do something 
} 

int main() 
{ 
    .... 
    if (CONSTANT_1) function_1() 
    else if (CONSTANT_2) function_2() 
    else if (CONSTANT_3) function_3() 
    ....  
} 

가 나는 경우-else 문을 피하기 좋아하고 주요 기능에서 같은 것을 할 것입니다 :

int main() 
{ 
    function<CONSTANT>(); 
} 

if-else 문을 사용하지 않고 어떻게 동작을 시뮬레이트 할 수 있습니까?

+0

템플릿을 사용해야합니까? 그렇지 않다면 상수 맵과 함수 포인터를 사용할 수 있습니다. 그런 다음 주어진 상수에 대해 map에서 얻은 함수를 호출하십시오. – uptoNoGood

답변

1

오버로드 및 태그 발송. 기본 템플릿은 상수를 고유 한 유형으로 변환합니다. 그런 다음 간단한 과부하 해결로 적절한 과부하가 선택됩니다. 상수는 constexpr이고 실행시에만 알려진 것이 아닙니다.

void function(std::integral_constant<int, CONSTANT_1>) 
{ 
    //do something 
} 


void function(std::integral_constant<int, CONSTANT_2>) 
{ 
    //do something 
} 


int function(std::integral_constant<int, CONSTANT_3>) 
{ 
    //do something 
} 

template<int constant> 
auto function() 
{ 
    return function(std::integral_constant<int, constant>{}); 
} 

int main() 
{ 
    function<CONSTANT_2>(); // calls the second overload 
} 

위는 과부하가 발견되지 않을 때 대신 템플릿 기능을 전문으로하는 경우 연결 오류에 반대, 컴파일 타임 오류를 발행의 이점이있다.

1

는 일반적으로 당신은 함수 템플릿 전문 수 있습니다

template<int N> 
void function(); 

template<> 
void function<1>() 
{ 
    //do something 
} 

template<> 
void function<2>() 
{ 
    //do something 
} 

template<> 
void function<3>() 
{ 
    //do something 
} 

이 작동을하지만,뿐만 아니라 더 나은 솔루션이있을 수 있습니다.