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개나 들어가 코드비대화되는 걸 최소화하기 위해 파라미터 하나만 있으면 되는 비대화의 주범을 별도의 기본 클래스 빼내는 방법이에요 좀 핵스럽긴 하지만 이런거보면 데이터형이 아닌 템플릿 파라미터 엄청 유용하네요(딱히 그런 파라미터라 가능한 일이 아니라 취소선 긋습니다)
아니 칼라 스크립터에서 복사했는데 가운데 정렬 무엇 ㅠㅠ
carbon.now.sh - 훈다리 훈다리
저도 카본이 좋은데 지금 파일 업로드가 막혀있는 컴이네요 흐규흐규