簡體   English   中英

如何基於類模板參數專門化成員函數

[英]How to specialize member functions based on class template argument

問題怎么說。 此外,可以內聯嗎?

這是一個簡單的例子,僅供參考...

template<typename T>
class Foo {
 public:
  Foo() :z(0.0) {}

  void do( const Foo<T> &f ) {
    z = f.z;
  }
  // specialize 'do' for Foo<int>, possible inline?

 private:
  T z;
};

您不需要做任何復雜的事情。 只需使用重載和委派。 請注意,我們不能僅僅添加一個int重載,因為當T證明是int ,這將是一個無效的重載(兩個具有相同簽名的函數)

template<typename T>
class Foo {
 public:
  Foo() :z(0.0) {}

  void doIt(const Foo<T> &f ) {
    doItImpl(f);
  }

 private:
  template<typename U>
  void doItImpl(const Foo<U> &f) {
    z = f.z;
  }

  void doItImpl(const Foo<int> &f) {
    /* ... */
  }

 private:
  T z;
};

或者,對於這種情況,您可以通過專門化來實現

template<typename T>
class Foo {
 public:
  Foo() :z(0.0) {}

  void doIt(const Foo<T> &f ) {
    z = f.z;
  }

 private:
  T z;
};

template<>
inline void Foo<int>::doIt(const Foo<int> &f) {
  /* ... */
}

只有在所有模板參數均已固定的情況下,使用這種方式才能使用特殊化。 換句話說,不可能部分地專門化成員函數。

通過使成員函數成為成員函數模板並使用SFINAE(替代失敗不是錯誤),可以得到這種行為。 例如:

template <typename U>
typename std::enable_if<!std::is_integral<U>::value && 
                        std::is_same<T, U>::value, void>::type
f(const Foo<U>& x)
{
}

template <typename U>
typename std::enable_if<std::is_integral<U>::value && 
                        std::is_same<T, U>::value, void>::type
f(const Foo<U>& x)
{
}

is_integral類型特征測試U是否為整數類型。 如果不是,則第一個實例化;否則,第一個實例化。 如果是,則第二個實例化。

is_same類型特征測試可確保TU是同一類型。 這用於確保不針對除Foo<T>之外的任何類型的實例化成員函數模板。

這個例子使用了C ++ 0x <type_traits>庫。 Boost還具有您可以使用的類型特征庫 ,該庫的工作原理基本相同。

您可以嘗試執行以下操作(未測試,可能無法正常工作):

template<typename T>
class Foo {
 public:
  Foo() :z(0.0) {}

  template<typename Ty = T>
  void do( const Foo<T> &f ) {
    z = f.z;
  }

  template<>
  void do<int>( const Foo<T> &f ) {
    //specialized code
  }

 private:
  T z;
};

暫無
暫無

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

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