함수 정보를 구하는 traits 만들기
-
메인 템플릿(Primary template)을 만들고 typedef T type 제공
-
함수 타입의 T안에 있는 리턴 타입을 얻을 수 있도록 부분 특수화 구현
-
부분 특수화를 할땡 가변인자 템플릿을 활용
#include <iostream>
#include <vector>
#include <type_traits>
using namespace std;
double hoo(short a, int b) { return 0; }
// 메인 템플릿
template<typename T>
struct result_type
{
typedef T type;
};
// 함수 타입에 대한 부분 특수화, 가변인자 활용
template<typename T, typename ... Types>
struct result_type<T(Types ... args)>
{
typedef T type;
};
template<typename T> void foo(const T& t)
{
// T : double(short, int) 함수 모양
typename result_type<T>::type ret;
cout << typeid(ret).name() << endl;
}
int main()
{
foo(hoo);
}
traits 잘못 사용할때 처리 방법
-
메인 템플릿에서 typedef T type을 제공하지 않는 방법
-
메인 템플릿에서 static_assert()를 사용해서 명시적 에러 메시지 출력
-
메인 템플릿의 선언만 구현
#include <iostream>
#include <vector>
#include <type_traits>
using namespace std;
double hoo(short a, int b) { return 0; }
// 1. typedef T type 미제공
template<typename T>
struct result_type
{
};
// 2. static_assert()를 사용해서 에러 메시지 출력
template<typename T>
struct result_type
{
static_assert(is_function<T>::value, "Not supported type");
};
// 3. 선언부만 제공
template<typename T>
struct result_type;
// 함수 타입에 대한 부분 특수화
template<typename T, typename ... Types>
struct result_type<T(Types ... args)>
{
typedef T type;
};
template<typename T> void foo(const T& t)
{
// T : double(short, int) 함수 모양
typename result_type<T>::type ret;
cout << typeid(ret).name() << endl;
}
int main()
{
foo(hoo);
}
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 가변인자 템플릿(Variadic template) tuple 만들기 (0) | 2021.01.06 |
---|---|
C++ 가변인자 템플릿(Variadic template) 함수 인자타입 구하기 (0) | 2021.01.06 |
C++ 가변인자 템플릿(Variadic template), fold expression(C++17) (0) | 2021.01.06 |
C++ 가변인자 템플릿(Variadic template) (0) | 2021.01.05 |
C++ 템플릿 type_traits(C++11 표준 remove_pointer, is_pointer) (0) | 2021.01.04 |