template
타입만 다르고 구현이 동일하거나 유사한 함수의 경우 템플릿을 활용할 수 있다.
아래와 같이 square() 함수가 2개가 있을 때, 구현이 동일하기에 템플릿으로 만들어 볼 수 있다.
int square(int a)
{
return a * a;
}
double square(double a)
{
return a * a;
}
int main()
{
square(3);
square(3.3);
}
square 함수 탬플릿은 아래와 같은 형태로 만들어 볼 수 있다.
template<typename T> 의미 : 템플릿을 만들거야! 물론 type을 하나 T로 받을 거야! 하나 받으면 이 형태로 아래 형태로 만들어줘!
* T는 다른 값으로도 사용이 가능하지만 약속으로 굳어져서 거의 T를 사용함.
// 템플릿 사용 방법
template<typename T>
T square(T a)
{
return a * a;
}
int main()
{
square<int>(3); // int square(int a) 함수 생성됨
square<double>(3.3); // double square(double) 함수 생성됨
}
템플릿으로 생성된 함수를 호출할 때 인자값을 명시적으로 정해주지 않아도 상관없다. (이렇게 사용하기 위해 템플릿을 사용하는 것이다.)
컴파일러가 알아서 해결해 준다.
template<typename T> // template parameter
// template<class T> // 위 코드와 완전 동일함 (초기에 쓰던 방식임)
T square(T a) // call parameter
{
return a * a;
}
int main()
{
// square<int>(3);
// square<double>(3.3);
square(3);
square(3.3); // 이렇게 명시적인 타입을 <int> or <double> 넣어주지 않아도 사용에 문제 없다.
// 컴파일러가 알아서 결정해 준다 (type deduction)
}
https://en.cppreference.com/w/cpp/language/templates
구조체(struct)를 템플릿(template)으로 만드는 방법
기존 struct 의 형태가 아래처럼 있다. 이 struct를 템플릿으로 만들어 보려 한다.
struct Point
{
int x;
int y;
};
int main()
{
Point pt;
pt.x = 1;
pt.y = 1;
}
구조체를 템플릿으로 만들었을 때 아래와 같이 만들어진다.
#include <iostream>
template<typename T> // 템플릿으로 만들기 위해 이 한 줄 넣어주면 된다!
struct Point
{
T x; // 입력받는 type T 를 활용해서 변수가 정해진다.
T y; // 입력받는 type T 를 활용해서 변수가 정해진다.
};
int main()
{
Point<int> pt; // c++17부터는 생성자가 있으면 템플릿 파라메터<int> 전달도 생략이 가능함.
pt.x = 1;
pt.y = 1;
std::cout << "int) " << pt.x << ", " << pt.y << std::endl;
Point<double> pt2;
pt2.x = 1.1;
pt2.y = 2.2;
std::cout << "double) " << pt2.x << ", " << pt2.y << std::endl;
}
템플릿으로 생성된 struct의 value들를 불러와 출력해보면 잘 된다.
두 개의 타입을 받아 처리하는 템플릿 선언하는 방법
// T1, T2 두 개의 타입을 받아 처리하는 템플릿 선언하는 방법
//====================================================
// C++14 부터 지원
//====================================================
template<typename T1, typename T2>
auto add(T1 a, T2 b) // C++14
{
return a + b;
}
int main()
{
add(1, 2.1);
}
//====================================================
// C++11 부터 지원
//====================================================
template<typename T1, typename T2>
auto add(T1 a, T2 b) -> decltype(a + b) // C++11
{
return a + b;
}
int main()
{
add(1, 2.1);
}
inline
add1을 호출하면 add1의 함수를 불러 값을 받아 처리한다.
add2 와 같은 inline 함수를 호출하면 함수로 이동해서 처리하는 방식이 아니라, 함수의 기계어 코드를 치환한다.
- add2(1,2) 자리에 inline 에 정의 되어 있는 코드가 add2() 코드를 대신해서 수행이 되는 개념이다.
장점 : 처리 속도가 빠르다.
단점 : inline 코드가 길면 ... 사용을 비추천 (코드가 길면 일반 함수로 정의할 것)
int add1(int a, int b)
{
return a + b;
}
inline int add2(int a, int b)
{
return a + b;
}
int main()
{
int n1 = add1(1,2); // 호출
int n2 = add2(1,2); // 치환
}
선언부와 구현부 코드가 있을 때 inline은 아래와 같이 선언부에 직접 코드를 작성한다.
간단한 계산의 코드를 header에만 inline으로 함수를 만들어 사용하기에 좋다.
/******* add.h *******/
int add1(int a, int b);
//inline int add2(int a, int b);
inline int add2(int a, int b)
{
return a + b;
}
/******* add.cpp *******/
int add1(int a, int b)
{
return a + b;
}
#include "add.h"
int main()
{
add1(1,2);
add2(1,2);
}
https://en.cppreference.com/w/cpp/language/inline
'C++' 카테고리의 다른 글
[C++] 함수 : 후위 반환 타입(suffix return, trailing return) (0) | 2021.08.10 |
---|---|
[C++] 함수 삭제 (function delete) (0) | 2021.08.09 |
[C++] 함수 : default parameter, function overloading (0) | 2021.08.08 |
[C++] string : 비교, 대입, c_str() (0) | 2021.08.07 |
[C++] 변수 선언 : constexpr, structure binding (0) | 2021.08.07 |
댓글