簡體   English   中英

模板類型推導

[英]Template type derivation

我需要使用模板來實現一個類,例如“ 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中實現它?

可能的解決方案是定義一個簡單的類型特征以提取正確的類型

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;
 };

如果要確保T是基本類型(或者您是說算術?),則要復雜一些。

一種可能的方法是定義類型特征,如果類型是std::complex ,則說( truefalse

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

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

接下來用聲明(沒有通用定義)和兩個默認布爾值修改myTypeTraits

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>{}, "!" );
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM