[모던C++입문] 5.2 타입정보 제공하기 및 사용하기
- 📕 Book/모던C++입문
- 2021. 7. 24.
5.2 타입 정보 제공하기 및 사용하기
타입 특성
template<typename T>
T inline min_magnitude(const T& x, const T& y)
{
using std::abs;
T ax = abs(x), ay = abs(y);
return ax < ay ? x : y;
}
double d1 = 3., d2 = 4.;
cout << min_magnitude(d1, d2) << endl; //가능
std::complex<double> c1(3.), c2(4.);
cout << min_magnitude(c1, c2) << endl; //오류 operator < 관련
//C++11이상에서는 컴파일러에 임시변수의 타입을 추론하라고 맡길 수 있음
template<typename T>
T inline min_magnitude(const T& x, const T& y)
{
using std::abs;
auto ax = abs(x), ay = abs(y);
return ax < ay ? x : y;
}
- C++는 타입특성(Type Trait)을 통해 타입의 속성을 제공
//타입을 모를땐 T의 크기 타입은 T라고 가정
template<typename T>
struct Magnitude
{
using type = T;
}
//모든 complex타입에 대한 부분 특수화
template<T>
struct Magnitude<std::complex<T>>
{
using type = T;
}
//이제 다음과 같이 사용가능
template<typename T>
T inline min_magnitude(const T& x, const T& y)
{
using std::abs;
typename Magnitude<T>::type ax = abs(x), ay = abs(y);
return ax < ay ? x : y;
}
조건부 예외 처리
- noexcept는 함수가 예외를 던질 수 없다는걸 나타낸다
- 예외처리 코드를 생성치 않고 예외가 발생할 경우 프로그램을 죽이거나 정의되지 않은 행동을 유발
표준 타입 특성
- C++ 표준 타입 특성은 Boost 라이브러리 콜렉션에서 비롯됨
- Boost 타입 특성에서 C++ 표준 타입 특성으로 옮길때 일부 이름이 다르거나 동작이 다른 부분이 있다.
도메인 타입의 특성
//is_matrix 속성을 구현하기 위해 명시적인 matrix 타입이 아니면 기본적으로는 false인 선언을 먼저 한다.
template<typename T>
struct is_matrix
{
static const bool value = false;
};
//표준 라이브러리는 위 정적 상수만 포함하는 false_type을 제공
template<typename T>
struct is_matrix
: std::false_type
{ };
//이제 모든 행렬 클래스에 대해 특수화 한다
template<typename Value, typename Param>
struct is_matrix<mtl::dense2d<Value, Param>>
: std::true_type
{ };
enable_if
- enable_if는 Jaakko Jarvi와 Jeremiah Wilcock이 발견
- enable_if는 SFINAE(Substitution Failure Is Not An Error) 법칙을 기반
- 인수타입으로 추론할 수 없는 헤더를 갖는 함수 템플릿은 무시하며 오류를 발생시키지 않는다.
반응형