2010-03-26 3 views
2

C++에서 클래스 T를 사용하는 장점 중 하나는 함수의 데이터 유형이 다른 함수 (예 : int main)에 정의되어있는 경우 함수에서 데이터 유형을 재정의하는 시간을 줄이는 것입니다. class T in C++ (사용자 정의)

template <class T> 
void showabs(T number) 
{ 
    if (number < 0) 
    number = -number; 
    cout << number << endl; 
    return 0; 
} 

int main() 
{ 
    int num1 = -4; 
    float num2 = -4.23f; 

    showabs(num1); 
    showabs(num2); 

    return 0; 
} 

그래서이 경우, 클래스 T 않고, 각 데이터 유형에 대해, 우리는, 즉, 해당 데이터 타입의 조건을 추가하기 위해 인터넷 용 if 문의 또 다른 세트 및 부동 소수점에 대한 또 다른 하나가 있습니다.

맞습니까?

+1

"클래스 T 사용"이라고 말하면 실제로 "함수 템플릿 사용"을 의미합니까? –

답변

1

if 문은 number 매개 변수의 유형을 선언하는 데 도움이되지 않습니다. 난 당신이 처리하고자하는 각 유형에 대한 showabs 함수를 오버로드해야한다는 것을 의미한다고 생각합니다. 그렇다면 예, 올바른 방향으로 가고 있습니다.

+0

오른쪽, 각 유형에 대해, 우리는 showabs 함수에서 위에 언급 한 것과 비슷한 if 문을 사용해야합니다. – CppLearner

11

class T 일 필요는 없습니다. class Key 또는 원하는대로 지정할 수 있습니다 (class 대신 typename을 사용할 수도 있음). 올바른 용어는 함수 템플리트입니다. 함수 템플리트를 사용하면 전달 될 수있는 모든 유형의 함수를 다시 정의해야 할 필요가 없습니다. 따라서 템플릿을 사용하지 않았다면 두 가지 기능을 정의해야합니다.

void showabs(float number){ 
    if (number < 0) number = -number; 
    cout << number << endl; 
} 

void showabs(int number){ 
    if (number < 0) number = -number; 
    cout << number << endl; 
} 

많은 반복 코드를 의미합니다. 어떤 경우에는 void* 포인터를 사용할 수 있습니다 (C에서 많이 보게됩니다). 그렇게하면 형식 안전성뿐만 아니라 못생긴 인터페이스가 발생합니다.

그것은 현실에서, 당신이 개 기능은

showabs(num1); //showabs<int>(num1); 
showabs(num2); //showabs<float>(num2); 

은 실제로 두 개의 서로 다른 기능의 정수를 취 부동 한 소요 하나를 가리 호출하는 주목할 가치가있다. 따라서 템플릿을 사용하면 컴파일러가 복사 및 붙여 넣기를 훨씬 더 지능적인 방법으로 수행 할 수 있습니다.

1

글쎄, 그것은 "하나의 이점"이 아니라 많은 다른 것들이 있습니다. 템플릿은 재사용을 위해 만들어 졌으므로 템플릿을 작성할 때 모르는 유형의 템플릿 함수 또는 클래스를 사용할 수 있습니다.

1

기본적으로, 당신은 정확하지만, 더 당신이 템플릿, 즉, template-metaprogramming로 할 수있는 많은있다. 전문 용어를 명확히하기 위해 class Ttypename Foo 일 수 있습니다. class T은 템플릿 매개 변수이고 템플릿 매개 변수가있는 함수 정의는 function-template이며 템플릿 매개 변수가있는 클래스 정의는 클래스 템플릿입니다.