type_trais
- type_traits는 포인터인지 아닌지 타입을 알아내기 위해서 type traits 만드는 일반적인 방법이다..
is_pointer 구현..
소스
template<typename T>
struct Is_pointer
{
//bool value = false가 안되는 이유는 이것은 변수이다.!! 변수이면 run time까지 가게되는데.. 밑의 Is_pointer<T>::value는 컴파일 시간에 사용이 되어야한다..
//enum{value = false};
static constexpr bool value = false;
};
//포인터 타입에 대해서부분 특수화..!
template<typename T>
struct Is_pointer<T*>
{
//enum { value = true };
static constexpr bool value = true;
};
template<typename T>
void foo(T v)
{
//컴파일 시간에 사용한다고 메타함수라고한다..
if (Is_pointer<T>::value)
cout << "pointer" << endl;
else
cout << "not pointer " << endl;
}
int main()
{
int n = 3;
foo(n);
foo(&n);
return 0;
}
- 위에서 Is_pointer를 만들 때 eum을 사용하고 bool을 사용하지 않은 이유는 enum을 사용하면 상수라서 컴파일 타임에 결정되기 때문에 사용했다.. 그렇지만 modern으로 오면서 static constexpr이 생겨서 이것은 타입 명시 가능 + 컴파일 타임이 가능해서 더 효과적이다.. 이것으로 사용..
- 위에서 is_pointer는 이미 c++에 들어있다. 위에서 primarytemplate에서는 모든 것을 받으면서 false로 해 놓은 다음 포인터 타입만 받는 템플릿을 부분특수화로 따로 만들면서 그곳에는 true로 설정해놓으면된다..
is_array
소스
template<typename T>
struct Is_array
{
static constexpr bool value = false;
};
template<typename T, size_t N>
struct Is_array<T[N]>
{
static constexpr bool value = true;
};
template<typename T>
void foo(T& a)
{
if (Is_array<T>::value)
cout << "array" << endl;
else
cout << "not array" << endl;
}
int main()
{
int x[4] = { 1, 2, 3, 4 };
foo(x);
return 0;
}
remove_pointer
- c++14?인가에서 type_traits에서 remove_ponter라고 포인터를 땐 타입을 알려는 것이 있다 이것을 구현해보자 일단 첫번째 스텝으로 하나의 포인터를 땐 것을 구현하고 c++에서 제공하지 않는 다중포인터를 때는 즉 모든 포인터를 제거하고 타입을 반환하는 것도ㅗ 구해보자.!!
remove_pointer..
#include <iostream>
#include <type_traits>
using namespace std;
//==============remove-pointer
template<typename T>
struct RemovePointer
{
typedef T type;
};
template<typename T>
struct RemovePointer<T*>
{
typedef T type;
};
template<typename T>
void foo(T a)
{
typename RemovePointer<T>::type t;
}
int main()
{
int n = 10;
foo(&n);
return 0;
}
구현은 모든 type_trais가 거의 동일하다. 일단 primamry template을 만들어 놓고 시작하면서 필요한 것들을 부분특수화하면서 하면된다.
위에서 그대로 타우고 T* 를 받는 것을 만들어주면 그대로 T를 반환해주면된다 모양을 확인하면서 이해하면된다.
remove_all_pointer
- ㅊ=+
'c++ > template프로그래밍.' 카테고리의 다른 글
std::condition 구현 (0) | 2022.05.23 |
---|---|
template_CRT (0) | 2022.05.22 |
template기본문법 (parameter, friend, typename..) (0) | 2022.05.18 |
templateSpecialization, meta template.. (특수화, 메타 템플릿..) (0) | 2022.05.16 |
thintemplate (0) | 2022.05.16 |