首頁 > 後端開發 > C++ > 主體

如何在C中使用enable_if根據類別模板參數選擇成員函數?

DDD
發布: 2024-10-26 05:50:30
原創
129 人瀏覽過

How to Select Member Functions Based on Class Template Parameters Using enable_if in C  ?

使用不同的enable_if條件選擇成員函數

在C中,enable_if元函數可用於根據選擇性地啟用或停用程式碼-時間條件。這種技術通常用於提供成員函數的重載,這些函數可以處理不同類型的參數或根據範本參數執行不同的操作。

當嘗試使用enable_if根據類別模板參數在成員函數之間進行選擇時,這一點很重要了解enable_if透過替換模板參數來工作,從而導致從重載解析集中刪除錯誤。

問題:

在提供的程式碼中, enable_if 條件直接應用於成員函數,但這種方法沒有達到預期的效果,因為實例化這些函數時模板參數T 是已知的。

<code class="cpp">template<typename T>
struct Point
{
  void MyFunction(typename std::enable_if<std::is_same<T, int>::value, T &>::type* = 0)
  {
    std::cout << "T is int." << std::endl;
  }

  void MyFunction(typename std::enable_if<!std::is_same<T, int>::value, float &>::type* = 0)
  {
    std::cout << "T is not int." << std::endl;
  }
};</code>
登入後複製

解決方案:

要解決此問題,請建立一個預設為T 的虛擬模板參數,並使用它來執行SFINAE(替換失敗不是錯誤)檢查。這種方法允許編譯器根據虛擬參數的類型決定要呼叫哪個成員函數。

<code class="cpp">template<typename T>
struct Point
{
  template<typename U = T>
  typename std::enable_if<std::is_same<U, int>::value>::type
    MyFunction()
  {
    std::cout << "T is int." << std::endl;
  }

  template<typename U = T>
  typename std::enable_if<std::is_same<U, float>::value>::type
    MyFunction()
  {
    std::cout << "T is not int." << std::endl;
  }
};</code>
登入後複製

防止明確模板參數特殊化:

如上所述透過HostileFork,使用者可以明確指定成員函數的範本參數,這可能會導致不正確的結果。為了防止這種情況,請使用 static_assert 檢查是否未提供明確參數:

<code class="cpp">template<typename T>
struct Point
{
  template<typename... Dummy, typename U = T>
  typename std::enable_if<std::is_same<U, int>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout << "T is int." << std::endl;
  }

  template<typename... Dummy, typename U = T>
  typename std::enable_if<std::is_same<U, float>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout << "T is not int." << std::endl;
  }
};</code>
登入後複製

以上是如何在C中使用enable_if根據類別模板參數選擇成員函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!