C++ 멤버 함수를 한 번 더 템플릿화하기
·
C++/Templates
멤버 함수를 한 번 더 템플릿화하기 클래스 템플릿에 있는 멤버 함수를 또 다시 템플릿화할 수 있다. 예제 #include using namespace std; template class A { T value_; public: A(const T & input) : value_(input) {} template void doSomething() { cout
C++ 포인터 템플릿 특수화(Pointer Templates Specialization)
·
C++/Templates
포인터 템플릿 특수화(Pointer Templates Specialization) 템플릿 파라미터가 포인터인 경우 특수화를 하고 싶다면 클래스명에 를 붙여서 작성한다. 예제 #include using namespace std; template class A { T value_; public: A(const T & input) : value_(input) {} void print() { cout
C++ 템플릿 부분 특수화 (Templates Partial Specialization)
·
C++/Templates
템플릿 부분 특수화 (Templates Partial Specialization) 템플릿에서 여러 파라미터를 받을 때, 특정 파라미터만 특수화할 수 있다. 예제 일반 함수 템플릿 부분 특수화 #include using namespace std; template class StaticArray { private: T array_[size]; public: T* getArray() { return array_; } T& operator[](int index) { return array_[index]; } }; template void print(StaticArray& array) { for (int count = 0; count < size; ++count) cout
C++ 클래스 템플릿 특수화 (Class Templates Specialization)
·
C++/Templates
클래스 템플릿 특수화 (Class Templates Specialization) 템플릿의 특정 자료형에 대해서 다르게 처리하고 싶을 때 사용한다. 함수 템플릿 특수화에서는 template을 명시하지 않아도 작동이 됐는데, 클래스 템플릿 특수화에서는 명시하지 않으면 오류가 발생한다. error C2906: &#39;A&#39;: explicit specialization requires &#39;template &#39; 예제 클래스 템플릿 특수화는 다른 클래스를 하나 따로 만들었다고 생각해야 한다. 아래의 예제에서 a_char.test 함수는 존재하지 않는다. 상속과는 엄연히 다르다. #include "MyArray.h" using namespace std; template class A { public..
C++ 함수 템플릿 특수화 (Function Templates Specialization)
·
C++/Templates
함수 템플릿 특수화 (Function Templates Specialization) 템플릿이 있는 상태에서, 특정 자료형에 대해 다른 코드를 실행하고 싶을 때 사용한다. explicit instantiation과 비슷한 느낌인데, 이렇게 정의된 함수는 템플릿에서 따로 인스턴스화하지 않는다고 생각하면 될 것 같다. 예제 #include "MyArray.h" using namespace std; template T getMax(T x, T y) { return (x > y) ? x : y; } template char getMax(char x, char y) { cout y) ? x : y; } int main() { cout
C++ 자료형이 아닌 템플릿 매개변수 (Non-type Templates Parameters)
·
C++/Templates
자료형이 아닌 템플릿 매개변수 (Non-type Templates Parameters) 템플릿 매개변수는 컴파일 타임에 결정되어야 한다. 템플릿의 원리가 여러 경우에 대해 컴파일을 따로 해주는 것이기 때문이다. Non-type 파라미터를 사용할 경우 헤더에서 함수를 정의한다. template와 같이 unsigned int가 온다고 생각해보자. 모든 숫자에 대해 explicit instantiation을 적용할 수는 없으므로 헤더에서 정의하는 것이다. 예제 main.cpp #include "MyArray.h" int main() { MyArray my_array; for (int i = 0; i < my_array.getLength(); ++i) my_array[i] = i * 0.5; my_array.p..
C++ 클래스 템플릿 (Class Templates)
·
C++/Templates
클래스 템플릿 (Class Templates) 클래스에도 템플릿을 적용할 수 있다. 예제 템플릿을 사용하지 않은 예제 main.cpp #include "MyArray.h" int main() { MyArray my_array(10); for (int i = 0; i < my_array.getLength(); ++i) my_array[i] = i * 10; my_array.print(); } /* stdout 0 10 20 30 40 50 60 70 80 90 */ MyArray.h #pragma once #include #include class MyArray { int length_; int* data_; public: MyArray() { length_ = 0; data_ = nullptr; } My..
C++ 함수 템플릿 (Function Templates)
·
C++/Templates
함수 템플릿 (Function Templates) template, template의 형태로 템플릿을 선언할 수 있다. 예제 #include template T getMax(T x, T y) { return (x > y) ? x : y; } class Cents { int cents_; public: Cents(int cents = 0) { cents_ = cents; } bool operator > (const Cents& c) { return (cents_ > c.cents_); } friend std::ostream& operator
C++ 템플릿 (Templates)
·
C++/Templates
템플릿 (Templates) 함수 템플릿 (Function Templates) 클래스 템플릿 (Class Template) 자료형이 아닌 템플릿 매개변수 (Non-type Templates Parameters) 함수 템플릿 특수화 (Function Templates Specialization) 클래스 템플릿 특수화 (Class Templates Specialization) 템플릿 부분 특수화 (Templates Partial Specialization) 포인터 템플릿 특수화(Pointer Templates Specialization) 멤버 함수를 한 번 더 템플릿화하기