首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++11 編譯期檢測類型是否支持 operator== (SFINAE)

     編輯:C++ 入門

需求

在編譯期獲得常量 bool,指示類型 A 和 B 的實例能否用 == 比較。用於委託 (delegate) 等場景:有 == 則用它比較,否則退化為地址比較或直接 true。

實現思路 (expression SFINAE)

利用 decltype 和 std::declval 構造表達式,配合 std::void_t (C++17) 或 std::enable_if 進行特徵檢測。

現代寫法 (C++17)

#include <type_traits>
#include <utility>

template
struct has_equal_operator : std::false_type {};

template
struct has_equal_operator() == std::declval())>> : std::true_type {};

// 使用
static_assert(has_equal_operator::value);
static_assert(!has_equal_operator::value);

C++11 相容寫法

template
struct has_equal_operator : std::false_type {};

template
struct has_equal_operator() == std::declval()), void>::value
    >::type> : std::true_type {}; // 注意:需處理 decltype 非 void 情況,實際更複雜

原文給出的代碼較繁雜,核心是利用 decltype(expr) 在模板參數中觸發 SFINAE。

應用示例

template
bool equal(const T& a, const T& b) {
    if constexpr (has_equal_operator::value) // C++17 if constexpr
        return a == b;
    else
        return &a == &b; // 地址比較 fallback
}

注意

  • 僅檢測語法合法性,不保證語義正確(如邏輯錯誤的 ==)。
  • C++20 概念 (Concepts) 可更優雅表達:concept EqualityComparable = requires(T a, U b) { a == b; };。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved