가능한 솔루션은 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>{}, "!");
}
이 부분 특수화에 대한 작업처럼 들리는 전체 컴파일 예이다. – Quentin
[기본 유형에 대한 템플릿 전문화] (https://stackoverflow.com/questions/45244809/template-specialization-for-fundamental-types) –
의 가능한 복제본은 산술 또는 '표준 :: 복잡'이 아닌 경우 어떻게해야합니까? – AndyG