」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何使用“enable_if”根據範本參數選擇成員函數?

如何使用“enable_if”根據範本參數選擇成員函數?

發佈於2024-11-06
瀏覽:674

How to Select a Member Function Based on a Template Parameter Using `enable_if`?

使用Enable_If條件選擇成員函數

任務是根據類別範本參數決定成員函數的呼叫。以下程式碼片段嘗試實現此目的:

#include 
#include 

template
struct Point
{
  void MyFunction(typename std::enable_if<:is_same int>::value, T &>::type* = 0)
  {
    std::cout ::value, float &>::type* = 0)
  {
    std::cout 

但是,此程式碼無法編譯,並出現錯誤「在 'struct std::enable_if' 中沒有名為 'type' 的型別」。

SFINAE in Action

理解這個問題的關鍵在於替換失敗不是錯誤(SFINAE)的概念。 Enable_if 允許基於模板參數進行條件編譯。在這種情況下,當實例化成員函數時,模板參數 T 是已知的。因此,在實例化時評估條件並選擇相應的函數。

修復程式碼

為了修正這個問題,我們需要引入一個虛擬範本參數預設為 T。這允許 SFINAE 機制按預期工作。修改後的程式碼如下所示:

template
struct Point
{
  template
  typename std::enable_if<:is_same int>::value>::type
    MyFunction()
  {
    std::cout 
  typename std::enable_if<:is_same float>::value>::type
    MyFunction()
  {
    std::cout 

防止顯式成員函數特化

正如HostileFork 所指出的,原始程式碼允許明確指定成員函數的範本參數,這可能會導致結果不正確。為了防止這種情況,我們可以新增一個 static_assert 來檢查是否提供了任何模板參數。這確保了始終根據模板參數 T 呼叫正確的成員函數。修改後的程式碼為:

template
struct Point
{
  template
  typename std::enable_if<:is_same int>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout 
  typename std::enable_if<:is_same float>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout 
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3