2017-11-16 9 views
-1

템플릿을 사용하여 'MyClass'클래스를 구현해야합니다.템플릿 유형 유도

template<class T> 
class MyClass 
{ 
public: 


      T var1; 
      T1 var2; 
     }; 

두 개의 멤버 변수 var1 및 var2가 있습니다. 클래스 템플릿 인수 'T'가 기본 유형 (예 : float, double 또는 long double) 인 경우 변수 var1 및 var2의 유형은 모두 템플릿 인수와 동일해야합니다. 위의 예에서 T1 = T입니다.

그러나 템플릿 인수가 std::complex<T> 인 경우, 내가

T var1; 
std::complex<T> var2; 

방법 C++ 11을에서 구현하고 싶은

?

+3

이 부분 특수화에 대한 작업처럼 들리는 전체 컴파일 예이다. – Quentin

+0

[기본 유형에 대한 템플릿 전문화] (https://stackoverflow.com/questions/45244809/template-specialization-for-fundamental-types) –

+1

의 가능한 복제본은 산술 또는 '표준 :: 복잡'이 아닌 경우 어떻게해야합니까? – AndyG

답변

6

가능한 솔루션은 T이 기본 유형이 있는지 확인하려면

template <typename T> 
struct myTypeTraits 
{ using type = T; }; 

template <typename T> 
struct myTypeTraits<std::complex<T>> 
{ using type = T; }; 

MyClass

template <typename T> 
class MyClass 
{ 
    using T0 = typename myTypeTraits<T>::type; 

    T0 var1; 
    T var2; 
}; 

될 올바른 유형을 추출하는 간단한 형식의 특성을 정의 할 수 (또는 수 산술을 의미합니까?), 좀 더 복잡합니다.

가능한 방법은 말을 유형은 std::complex

template <typename> 
struct isComplex : public std::false_type 
{ }; 

template <typename T> 
struct isComplex<std::complex<T>> : public std::true_type 
{ }; 

다음 선언 (NO 일반적인 정의) 및 이 개 기본 부울 값으로 myTypeTraits을 수정할 경우 (true 또는 false를) 타입의 특성을 정의하는 것입니다

template <typename T, bool = std::is_fundamental<T>::value, 
         bool = isComplex<T>::value> 
struct myTypeTraits; 

다음 두 가지 특수화는 기본 사항의 첫 번째 항목과 복합체 유형의 두 번째 항목

template <typename T> 
struct myTypeTraits<T, true, false> 
{ using type = T; }; 

template <typename T> 
struct myTypeTraits<std::complex<T>, false, true> 
{ using type = T; }; 

MyClass 클래스는 같음을 유지하지만 지금은 당신이 (예에 의해)와 std::string 인스턴스화하려고하면 오류를 제공합니다.

다음은

#include <complex> 
#include <type_traits> 

template <typename> 
struct isComplex : public std::false_type 
{ }; 

template <typename T> 
struct isComplex<std::complex<T>> : public std::true_type 
{ }; 

template <typename T, bool = std::is_fundamental<T>::value, 
         bool = isComplex<T>::value> 
struct myTypeTraits; 

template <typename T> 
struct myTypeTraits<T, true, false> 
{ using type = T; }; 

template <typename T> 
struct myTypeTraits<std::complex<T>, false, true> 
{ using type = T; }; 

template <typename T> 
class MyClass 
{ 
    public: // public to check with the static_assert() 
     using T0 = typename myTypeTraits<T>::type; 

    private: 
     T0 var1; 
     T var2; 
}; 

int main() 
{ 
    MyClass<int>     mi; // compile 
    MyClass<std::complex<float>> mc; // compile 
    // MyClass<std::string>   ms; // compilation error 

    static_assert(std::is_same<int, decltype(mi)::T0>{}, "!"); 
    static_assert(std::is_same<float, decltype(mc)::T0>{}, "!"); 
} 
+0

우수! 답변 해주셔서 감사합니다. 그러나, 방금 템플릿 매개 변수에 의존하는 멤버 함수가 있어야한다는 것을 알았습니다. 이 문제를 해결하고 우아한 해결책을 제공해 주시겠습니까? – Soo

+0

@Soo - 많은 차이점이 있다면 부분적으로 (My Quarter가 제안한 것처럼) 전체 MyClass를 고려해야합니다. 하지만 "템플릿 매개 변수에 따라 달라지는 멤버 함수"에 대한 도움말을 원한다면 미안하지만 너무 일반적입니다. 특정 예제를 사용하여 질문을 수정하거나 다른 질문에서 질문하는 것이 좋습니다. – max66