템플릿은 C++에서 함수나 클래스를 작성할 때, 데이터 타입을 미리 지정하지 않고 나중에 사용하는 시점에 지정할 수 있게 해주는 기능입니다. 즉, 특정 타입에 국한되지 않고 다양한 타입을 처리할 수 있는 일반화된 코드를 작성할 수 있게 합니다. 템플릿은 주로 다음 두 가지 형태로 사용됩니다:
- 함수 템플릿: 다양한 타입에 대해 동작하는 함수를 작성할 때 사용합니다.
- 클래스 템플릿: 다양한 타입에 대해 동작하는 클래스를 작성할 때 사용합니다.
예시
함수 템플릿
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
int result1 = add(3, 4); // int 타입으로 작동
double result2 = add(3.5, 4.5); // double 타입으로 작동
return 0;
}
클래스 템플릿
template <typename T>
class MyClass {
public:
T value;
MyClass(T val) : value(val) {}
T getValue() { return value; }
};
int main() {
MyClass<int> intObj(5); // int 타입으로 작동
MyClass<double> doubleObj(5.5); // double 타입으로 작동
return 0;
}
언리얼 소스코드에 대한 설명
template <typename DelegateSignature, typename UserPolicy = FDefaultDelegateUserPolicy>
class TDelegate
{
static_assert(sizeof(UserPolicy) == 0, "Expected a function signature for the delegate template parameter");
};
//-----------------------------------------------------
template <typename DelegateSignature, typename UserPolicy = FDefaultDelegateUserPolicy>
// 1) TDelegate 클래스는 두 개의 템플릿 파라미터를 받습니다.
// 2) DelegateSignature: 델리게이트의 함수 시그니처를 나타내는 타입입니다.
// 3) UserPolicy: 사용자 정책을 나타내는 타입으로, 기본값은 FDefaultDelegateUserPolicy입니다.
class TDelegate
{
static_assert(sizeof(UserPolicy) == 0, "Expected a function signature for the delegate template parameter");
};
// 1) static_assert는 컴파일 타임에 조건을 검사하여 조건이 거짓일 경우 컴파일 오류를 발생시킵니다.
// 2) sizeof(UserPolicy) == 0 조건이 항상 거짓이므로, 이 클래스 템플릿은 기본적으로 컴파일되지 않습니다.
// 3) 오류 메시지 "Expected a function signature for the delegate template parameter"는 DelegateSignature가 함수 시그니처 타입이 아니면 오류를 발생시킵니다.
static_assert 사용 목적
- static_assert는 템플릿 인스턴스화 시점에서 타입에 대한 제약 조건을 확인하기 위해 사용됩니다.
- 이 경우, UserPolicy가 기본값으로 설정되어 있고, DelegateSignature가 올바른 함수 시그니처인지 확인하는 역할을 합니다.
- 현재 코드에서는 sizeof(UserPolicy) == 0이 항상 거짓이므로, 컴파일 타임에 항상 오류가 발생합니다. 실제 구현에서는 이 static_assert 조건이 의미 있는 값으로 설정되거나, 다른 조건이 사용될 것입니다.
정리
- 템플릿은 C++에서 일반화된 코드를 작성할 수 있게 해주는 기능으로, 다양한 데이터 타입을 처리할 수 있습니다.
- TDelegate 클래스 템플릿은 두 개의 타입 파라미터를 받아 델리게이트를 정의하지만, 현재 static_assert로 인해 기본적으로 컴파일되지 않습니다.
- **static_assert**는 컴파일 타임에 조건을 검사하여, 특정 조건을 만족하지 않을 경우 컴파일 오류를 발생시킵니다. 이 예제에서는 DelegateSignature가 함수 시그니처인지 확인하는 용도로 사용됩니다.