42 Seoul
[42Seoul] CPP07 template
jaewpark
2022. 7. 25. 17:38
- swap: 지정된 두 인수 값을 바꿉니다. 아무것도 반환하지 않습니다
- min: 인수에 전달된 두 값을 비교하여 가장 작은 값을 반환합니다. 두 값이 같으면 두 번째 값을 반환합니다.
- max: 인수에 전달된 두 값을 비교하여 가장 큰 값을 반환합니다. 두 값이 같으면 두 번째 값을 반환합니다.
함수는 모든 유형의 인수로 호출할 수 있습니다.
유일한 요구 사항은 두 인수의 유형이 동일해야 하며 모든 비교 연산자를 지원해야 한다는 것입니다.
template (참고1, 참고2)
: 템플릿을 사용하면 클래스 또는 함수의 작업을 정의할 수 있으며 사용자가 이러한 작업이 작동해야 하는 구체적인 유형을 지정할 수 있습니다.
template <class identifier> function_declaration;
template <typename identifier> function_declaration;
// 함수 템플릿을 사용하기 위해 함수 호출에 대해 다음 형식을 사용합니다.
function_name <type> (parameters);
template <typename T>
T minimum(const T& lhs, const T& rhs)
{
return lhs < rhs ? lhs : rhs;
}
int x = 6, y = 13;
minimun<int>(6, 13);
typename (참고1, 참고2): 템플릿 정의에서 알 수 없는 식별자가 유형이라는 힌트를 컴파일러에 제공합니다.
템플릿 매개변수 목록에서 유형 매개변수를 지정하는 데 사용됩니다.
유형 매개변수
유형 매개변수 T 는 const 및 참조 한정자가 추가되는 함수 호출 매개변수에 사용될 때까지 어떤 식으로든 한정되지 않습니다.
수에는 실질적인 제한이 없습니다
줄임표 연산자(...)를 사용하여 임의 개수의 0개 이상의 유형 매개변수를 사용하는 템플릿을 정의할 수 있습니다.
template <typename T, typename U, typename V> class Foo{};
// ... 연산자
template<typename... Arguments> class vtclass;
vtclass< > vtinstance1;
vtclass<int> vtinstance2;
vtclass<float, bool> vtinstance3;
유형이 아닌 매개변수
표준 라이브러리 의 std::array 클래스 와 유사한 이 예제와 같이 배열의 길이를 지정하기 위해 정수 정수 값을 제공할 수 있습니다 .
template<typename T, size_t L>
class MyArray
{
T arr[L];
public:
MyArray() { ... }
};
템플릿 선언의 구문에 유의하십시오. 값 은 size_t컴파일 시 템플릿 인수로 전달되며 const또는 constexpr표현식이어야 합니다. 다음과 같이 사용합니다.
MyArray<MyClass*, 10> arr;
- 템플릿은 함수를 커스터마이징해서 범용적으로 사용할 수 있게하는 문법이다.
- 하지만 현재 객체지향 프로그램특성상 범용성보다는 명시성을 중요시 하므로 거의 쓰이지 않는다.
- c++에서 템플릿은 자료구조 컨테이너에서 활용하는게 대부분이다.
출처: https://blockdmask.tistory.com/43 [개발자 지망생:티스토리에서 댓글]
Exercise01
3개의 매개 변수를 사용하고 아무것도 반환하지 않는 함수 템플릿 iter를 구현합니다
- 첫 번째는 배열의 주소입니다.
- 두 번째는 배열의 길이입니다.
- 세 번째는 배열의 모든 요소에 대해 호출되는 함수입니다.
반복 함수 템플릿은 모든 유형의 배열과 함께 작동해야 합니다. 제3 파라미터는 인스턴스화된 함수 템플릿일 수 있다.
배열의 길이
int main(void)
{
int array[] = {7, 27, 42, 142, 242, 342, 442, 1, 2, 3};
int array_size = sizeof(array) / sizeof(array[0]);
int array_size2 = *(&array + 1) - array;
std::cout << array_size << std::endl;
std::cout << array_size2 << std::endl;
std::string array1[] = {"abc", "def", "ghij", "klmn"};
int array1_size = sizeof(array1) / sizeof(array1[0]);
int array1_size2 = *(&array1 + 1) - array1;
std::cout << array1_size << std::endl;
std::cout << array1_size2 << std::endl;
}
- sizeof : 배열의 크기를 구하고 각 Element의 크기를 나눠서 배열의 길이를 구할 수 있습니다.
- pointer arithmetic : (&arr + 1) 배열 끝 바로 뒤의 메모리 주소를 가리키고, 주소를 타입 * 으로 만들어 배열의 끝 주소에서 시작 주소를 빼서 배열의 길이를 구합니다.
Exercise02
contains elements of type T를 포함하고 다음 동작 및 함수를 구현하는 클래스 템플릿 배열을 만드세요.
- 매개 변수가 없는 생성: 빈 배열을 만듭니다.
- 부호 없는 int n을 매개 변수로 하는 생성: 기본적으로 초기화된 n개의 요소의 배열을 만듭니다.
Tip : int *a = new int()를 컴파일한 다음 *a를 표시하십시오. - 복사 및 할당 연산자에 의한 생성입니다. 두 경우 모두 복사 후 원본 배열이나 복사본을 수정해도 다른 배열에는 영향을 주지 않습니다.
- 메모리를 할당하려면 new[] 연산자를 사용해야 합니다. 예방적 할당(메모리 사전 할당)은 금지됩니다. 프로그램에서 할당되지 않은 메모리에 액세스해서는 안 됩니다.
- Elements는 첨자 연산자 [ ]를 통해 액세스할 수 있습니다.
- [ ] 연산자를 사용하여 요소에 액세스할 때 해당 인덱스가 범위를 벗어나면 std::exception 가 발생합니다.
- member function size(void) const 는 배열의 Elements 수를 반환합니다.