1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
template<typename T>
class MatrixBase
{
protected:
MatrixBase(T* data) : _data(data) {}
void work(size_t size)
{
// size를 참고해 _data를 조작하는 큰 작업
// 이 함수의 인스턴스화 횟수를 최소화하기 위해(코드 비대 최소화)
// size를 템플릿 파라미터가 아닌 멤버함수 파라미터로 함
// 이를 위해 해당 부분만 따로 베이스 클래스 템플릿으로 빼놓음
// size는 상속 클래스 템플릿에서 받아옴
std::cout << size << " * " << size << " matrix ";
}
private:
T* _data;
};
template<typename T, size_t N>
class Matrix : private MatrixBase<T>
{
public:
Matrix() : MatrixBase<T>(_data) {}
void work()
{
// 기본 클래스 템플릿에 size 넘겨줌
MatrixBase<T>::work(N);
}
private:
T _data[N * N];
};
int main()
{
Matrix<int, 256> m1;
m1.work();
Matrix<double, 16> m2;
m2.work();
}
cs


하나의 클래스 전체에 템플릿 파라미터가 2개나 들어가 코드비대화되는 걸 최소화하기 위해 파라미터 하나만 있으면 되는 비대화의 주범을 별도의 기본 클래스 빼내는 방법이에요 좀 핵스럽긴 하지만 이런거보면 데이터형이 아닌 템플릿 파라미터 엄청 유용하네요(딱히 그런 파라미터라 가능한 일이 아니라 취소선 긋습니다)