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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | #include <type_traits> #include <iostream> using namespace std; //////////////////////////////////////////////////////////////////////////////// /// enable_if가 반환값으로 사용된 경우 //////////////////////////////////////////////////////////////////////////////// // T가 float, doule, long double 인 경우 T 타입을 반환한다. template <typename T> typename enable_if_t<is_floating_point_v<T>, T> foo1(T t) { cout << "foo1: 실수형\n"; return t; } // enable_if_t는 C++11에서 지원하는 Aliasing template을 이용한 헬퍼! // Aliasing template은 VS2013에서부터 지원된다. // typename enable_if<is_integral<T>::value, T>::type과 동일하다. // T가 정수형인 경우 T 타입을 반환한다 template <typename T> enable_if_t<is_integral_v<T>, T> foo1(T t) { cout << "foo1: 정수형\n"; return t; } //////////////////////////////////////////////////////////////////////////////// /// enable_if가 함수 인자로 사용된 경우 //////////////////////////////////////////////////////////////////////////////// // T가 정수형이 아닌 경우 컴파일 에러가 발생하며, // T가 만약 int 타입인 경우 아래 함수는 다음과 같다. /* int foo2(int num, void* p = 0) { return num; } */ // enable_if의 템플릿 2번째 인자를 생략함으로써, defalut template parameter인 void 타입이 된다. template <typename T> T foo2(T t, typename enable_if_t<is_integral_v<T> >* = 0) { return t; } //////////////////////////////////////////////////////////////////////////////// /// enable_if가 함수 템플릿 인자로 사용된 경우 //////////////////////////////////////////////////////////////////////////////// // enable_if의 템플릿 2번째 인자를 생략함으로써, defalut template parameter인 void 타입이 된다 template <typename T, typename = typename enable_if_t<is_integral_v<T> > > T foo3(T t) { return t; } //////////////////////////////////////////////////////////////////////////////// /// enable_if가 클래스 템플릿 인자로 사용된 경우 //////////////////////////////////////////////////////////////////////////////// template <typename T, typename Enable = void> class A; // undefined // 템플릿 부분 특수화에 사용됨 // enable_if의 템플릿 2번째 인자를 생략함으로써, defalut template parameter인 void 타입이 된다 // 역시 실수형이 아니면 컴파일 에러 template <typename T> class A<T, typename enable_if_t<is_floating_point_v<T> > > { }; int main() { // OK, 정수형 foo1 호출 foo1(10); // OK, 실수형 foo1 호출 // 만약, 실수형 foo1 함수가 정의되어 있지 않다면, 컴파일 에러 foo1(1.2); // foo2는 정수형만 지원한다. // foo2(0.1)은 컴파일 에러 foo2(7); // foo3도 정수형만 지원한다 // foo3(1.2);은 컴파일 에러 foo3(34); // OK // A<int> a1; 컴파일 에러 A<double> a1; // OK } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | template <class T> class check { public: template< class U = T, typename std::enable_if<std::is_same<U, int>::value, int>::type = 0> inline static U readVal() { return BuffCheck.getInt(); } template< class U = T, typename std::enable_if<std::is_same<U, double>::value, int>::type = 0> inline static U readVal() { return BuffCheck.getDouble(); } }; | cs |
'Generic Programming' 카테고리의 다른 글
enable if 사용법 (0) | 2019.03.30 |
---|---|
커리 반대쪽부터 채우기 (0) | 2019.03.30 |
가변인자 템플릿 파라미터 팩 재귀호출 예제 (0) | 2019.03.30 |
템플릿 예제 (0) | 2019.03.23 |
가변인자 템플릿 예제 (0) | 2019.03.22 |