C++ template

2019. 8. 13. 11:14PL/C++

c++에서는 템플릿 언어를 이용해서 일반화 프로그래밍을 할 수 있다. 템플릿은 매개변수 타입에 따라 함수 및 클래스를 손쉽게 '일반적인' 형태로 만들 수 있다. 다양한 타입에 따라 동작할 수 있는 장점이 있어 소스코드의 재사용성이 높아진다

 

먼저 함수 템플릿을 살펴보면

 

#include <string>
#include <iostream>

using namespace std;

template <typename T>
void change(T &a, T &b)
{
    T tmp;
    tmp = a;
    a = b;
    b = tmp;
}

template <> void change<string>(string &a, string &b)
{
    cout << "명시적 템플릿 함수입니다\n";
    string tmp;
    tmp = a;
    a = b;
    b = tmp;
}

int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int a = 3, b = 4;
    change(a, b);
    cout << a << ' ' << b << '\n';
    string s1 = "노을", s2 = "수리";
    change(s1, s2);
    cout << s1 << ' ' << s2 << '\n';

    return 0;
}

 

다음으로 클래스 템플릿을 살펴보면, 함수 템플릿과 마찬가지로 선언부에 template를 사용하겠다고 명시하고 모든 자료형에 typename 이름을 넣어주면 된다. 또, typename 선언 시 기본으로 자료형을 넣어주면 default 자료형으로 동작한다

 

#include <string>
#include <iostream>

using namespace std;

template <typename T=double>
class A {
    private:
        T data;

    public:
        A(T data) {
            this->data = data;
        }
        void setData(T data) {
            this->data = data;
        }
        T getData(void) {  
            return data;
        }
};

int main(void) {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    A<int> a(3);
    cout << a.getData() << '\n';
    A<string> b("노을");
    cout << b.getData() << '\n';
    A<> c(3.3);
    cout << c.getData() << '\n';

    return 0;
}