저는 최근에 C ++로 템플릿 메타 프로그래밍을 배우고 있습니다. 계승 계산 예제를 확인한 후 템플릿 클래스가 아닌 템플릿 함수로만 동일한 작업을 수행 할 수 있는지 궁금했습니다. 내 첫 번째 시도는 다음과 같습니다.
#include <stdio.h>
#include <iostream>
using namespace std;
template <int t>
int multiply(t)
{
return (multiply(t-1) * t);
}
template <>
int multiply(1)
{
return 1;
}
int main () {
cout << multiply(5) << endl;
return 0;
}
하지만 다음과 같은 컴파일러 오류가 발생합니다.
temp.cpp:7: error: template declaration of 'int multiply'
temp.cpp:14: error: expected ';' before '{' token
temp.cpp: In function 'int main()':
temp.cpp:19: error: 'multiply' was not declared in this scope
템플릿 함수를 사용하여 이러한 템플릿 메타 프로그래밍을 할 수 있습니까? 이것이 허용됩니까?
주석에서 tobi303이 언급했듯이 유형 이름이 아닌 (t)
함수의 매개 변수 목록으로 사용하는 t
것은 의미가 없습니다.
이후 int t
템플릿 파라미터 아닌 일반 파라미터이고, 단지 (사이 템플릿 파라미터리스트에 존재해야 <
하고 >
각괄호)가 아닌 함수 파라미터 목록 (사이 (
및 )
괄호). 템플릿 매개 변수도 코드 multiply<5>()
대신에 그대로 전달되어야합니다 multiply(5)
.
다음과 같이 사용할 수 있습니다.
#include <iostream>
using namespace std;
template <int t>
constexpr int multiply() {
return multiply<t - 1>() * t;
}
template <>
constexpr int multiply<1>() {
return 1;
}
int main () {
cout << multiply<5>() << endl;
return 0;
}
또한 constexpr
컴파일 타임에 이러한 함수를 항상 평가할 수 있도록 (C ++ 11 이상)을 추가 했습니다. 그러나 컴파일러는 런타임이 아닌 컴파일 타임에 이들을 평가하도록 강요되지 않으며 런타임 오버 헤드로 끝날 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다