많은 질문과 답변을 읽었지만 this question은 내 눈을 가장 사로 잡았습니다. 그것과 그것의 해답은 도움이된다. 그러나 나는 아직도 내가 형식이 아닌 템플릿 인자를 사용하는 뒤에 사용법과 이론을 완전히 이해하지 못한다고 느낀다. 그것들은 사용되는 많은 유용한 예제를 제공하지만, 아무도 실제로 비 형식 템플릿 인자 뒤에있는 이론에 대해 밝히지는 않았다.왜 형식이 아닌 템플릿 인수가 사용됩니까?
예를 들어 구체적으로 알지는 못하지만보다 일반적인 이유는 정규 함수 인수가 아닌 형식이 아닌 템플릿 인수를 사용하는 이유입니다.
나는 그것이 컴파일 타임에 결정되고 모든 새로운 호출이 비 유형 템플릿 인자에 대해 결정된 값을 가진 새로운 함수를 생성한다는 것을 알고있다. 그렇다면 왜 함수에 원하는 매개 변수를 입력 할 수 있고 같은 결과를 가져올 수있을 때 같은 함수의 인스턴스를 여러 개 만들고 싶습니다. 컴파일 된 함수가 하나뿐입니다.
본질적으로 this page의 마지막 섹션에 따라 # 2 대신 # 1을 수행해야하는 이유는 무엇입니까? cplusplus.com?
# 1 :
template <class T, int N>
T fixed_multiply (T val)
{
return val * N;
}
int main() {
std::cout << fixed_multiply<int,2>(10) << '\n';
std::cout << fixed_multiply<int,3>(10) << '\n';
}
# 2 : 또한
template <class T>
T fixed_multiply (T val, int N)
{
return val * N;
}
int main() {
std::cout << fixed_multiply<int>(10, 2) << '\n';
std::cout << fixed_multiply<int>(10, 3) << '\n';
}
가 어떤 성능 이점 또는 둘 중 하나의 등이있을 것입니다? 형식이 아닌 템플릿 인수를 사용하여 이익을 얻을 수있는 일반적인 응용 프로그램이 있습니까? 아니면 특정 응용 프로그램에서 특정 결과를 산출하는 데 사용되는 매우 기술적 인 매개 변수입니까?
편집 : 이것은 몇 가지 이유로 복제본으로 표시되었으므로 첫 번째 단락에서 비슷한 질문에 대한 이유를 설명합니다.
이제 벡터의 모든 요소에'std :: transform'을 사용하여 5를 곱합니다. –
표시하는 예제에서는 차이점을 많이 만들지 않지만 두 값을 모두 비 형식 템플릿 인수로 만들면 큰 차이점은 템플릿 화 된 버전을 컴파일 타임에 평가되는'constexpr' 함수로 만들 수 있기 때문입니다. 형식이 아닌 템플릿 인수는 ['std :: array'] (http://en.cppreference.com/w/cpp/container/array) 또는 실제 배열을 얻기 위해 C 스타일 배열을 사용하는 함수에도 유용합니다 크기를 입력하고 런타임 인수로 크기를 전달할 필요가 없습니다. –
@Amit 그 질문의 첫 번째 줄에 링크 된 것과 같은 질문입니다. – Barmar