본문 바로가기
  • 쓸쓸한 개발자의 공부방
C++

[C++] 함수 : template, inline

by 심찬 2021. 8. 9.

 

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

 

Templates - cppreference.com

A template is a C++ entity that defines one of the following: Templates are parameterized by one or more template parameters, of three kinds: type template parameters, non-type template parameters, and template template parameters. When template arguments

en.cppreference.com


 

구조체(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

 

inline specifier - cppreference.com

The inline specifier, when used in a function's decl-specifier-seq, declares the function to be an inline function. A function defined entirely inside a class/struct/union definition, whether it's a member function or a non-member friend function, is impli

en.cppreference.com

 

댓글