2015-02-04 3 views
8

:템플릿 인자 코드 2 개 다음의 차이 란

1

template<size_t min, size_t max> 
bool byLength(const std::string& v) 
{ 
    return v.length() >= min && v.length() <= max; 
} 

2 :

템플릿 인자를 사용하여 주 사용 사례는 무엇
bool byLength(const std::string& v, size_t min, size_t max) 
{ 
    return v.length() >= min && v.length() <= max; 
} 

함수 인수 대신? 왜 두 번째 예를 사용하지 않는 것이 좋을까요?

+7

템플릿은 * 컴파일 타임 *에서 해결되며 인수는 * 런타임에 평가됩니다 *. 이것이 의미하는 바는 템플릿 인자는 컴파일러에 의해 해결 될 수 있어야한다는 것입니다. 반면에 함수 인자는 컴파일 시점에 평가할 수없는 use-input과 같은 것들이 될 수 있습니다. –

+0

좋아, 내가 질문의 어리 석음을 이해하는 것 같습니다. 삭제할 수 있습니까? –

+1

당신은 그것들을 diffrently : 'byLength (string)'vs'byLength (string, min, max)'라고 부릅니다. 그게 당신의 눈을 변화 시킨다면. – rubikonx9

답변

9

코드 2 개를 다음의 차이점은 무엇입니까?

템플릿 인수는 컴파일 타임에 지정해야합니다. 함수 인수는 변수이므로 컴파일 할 때 알 필요가 없습니다.

템플릿으로 설명하기 :

byLength<5,10>(v);  // OK 

size_t min,max; 
std::cin >> min >> max; 
byLength<min,max>(v); // ERROR: must be constants 

하면서 함수 인수 :

byLength(v, 5, 10);  // OK 

size_t min,max; 
std::cin >> min >> max; 
byLength(v, min, max); // OK 

템플릿 인자 대신 함수 인수를 사용하는 주요 사용 사례는 무엇입니까?

더 나은 최적화를 제공 할 수 있으며 상수 만 허용되는 상황 (예 : 배열의 크기)에서 사용할 수 있습니다.

두 번째 예제를 사용하지 않는 이유는 무엇입니까?

이 경우에는 실제로 그렇지 않습니까? 런타임시 인수를 계산하거나 프로그램의 입력에서 인수를 얻을 수 있으므로 유연성이 향상됩니다. 인라인 된 경우 상수 값을 사용하여 호출 할 때 템플릿만큼 효율적이어야합니다.

2

가장 큰 차이점은이 두 가지 기능을 수행 할 수있는 작업입니다 :

  • 템플릿 기능은 컴파일 타임에 알려진되어야 함을 의미 템플릿의 매개 변수로 두 개의 한계를 취
  • 정규 함수는 두 개의 한계를 일반 매개 변수로 사용하므로 변수를 사용할 수 있습니다.

기본적으로 두 번째 기능은 수행 할 수 있습니다이

int a, b; 
cout << "Please enter two limits: "; 
cin >> a >> b; 
string s("quick brown fox"); 
bool res = byLength(s, a, b); 
이 템플릿 기능을 할 수 없습니다

:

int a, b; 
cout << "Please enter two limits: "; 
cin >> a >> b; 
string s("quick brown fox"); 
bool res = byLength<a,b>(s); // <<== DOES NOT COMPILE. 

모든 통화가 제한 매개 변수에 대한 상수 식을 사용하는 경우, 템플릿 함수는 컴파일러가 최적화를 더 잘 수행 할 수 있기 때문에 몇 가지 추가 CPU 사이클을 절약 할 수 있습니다. 이러한 추가주기가 의미있는 차이를 만들 때 상황을 상상하기는 어렵습니다.

두 번째 예제를 사용하지 않는 이유는 무엇입니까?

함수에 컴파일 타임 상수가 필요한 상황이 있습니다. 예를 들어, 당신이 원하는 경우이 매개 변수 중 하나를 기반으로 std::array<len>, 그렇지 않은 일반 매개 변수로, 템플릿 매개 변수로 전달 될 필요가 선언 :

template<size_t sz> 
void demo() { 
    std::array<sz> data; 
    ... 
} 

일반 함수 매개 변수와 함께 작동하지 않을 것 같은 :

void demo(size_t sz) { 
    std::array<sz> data; // <<== DOES NOT COMPILE. 
    ... 
} 
1

consexpr이 아닌 값으로 템플릿을 호출 할 수 없습니다.

cin >> Min >> Max; 

// Cannot call by byLength<Min, Max>(string()); because the values are not constexpr 
byLength(string(), Min, Max); 
:

const auto Min = numeric_limits<int>::min(); 
const auto Max = numeric_limits<int>::max(); 

byLength<Min, Max>(string()); 

당신은 런타임에만 알려진 값 2를 사용하는 것 :

한 것은이 코드를 호출 할 수 있습니다 :

가장 간단한 예는 다음과 같이 될 것이다