使用元程式來偵測成員變數
問題:
我們如何判斷🎜>問題:
我們如何判斷一個類型包含特定的成員變量,即使其名稱未知或在不同的環境中使用不同的名稱類別?
解決方案:
#include <type_traits> template <typename T, typename = int> struct HasX : std::false_type { }; template <typename T> struct HasX<T, decltype((void) T::x, 0)> : std::true_type { };
一種方法涉及元編程技術並利用 decltype 運算符和 SFINAE(替換失敗不是錯誤)。考慮以下程式碼:
decltype((void) T::x, 0) 表達式欺騙編譯器將 T::x 視為 int 型別的表達式。這可確保 SFINAE 按預期發生。
用法:
template <typename T> bool Check_x(T p, typename HasX<T>::type b = 0) { return true; }
要使用此技術,請如下說明範本:
struct P1 { int x; };
對於具有x 成員變數的類,此檢查將傳回true,例如as:
struct P2 { float X; };
對於沒有的則為false,例如:
注意:
此解決方案避免使用C 11 功能,例如std::is_member_function_pointer,以保持與舊編譯器的相容性。以上是元程式設計如何偵測 C 類別中成員變數的存在?的詳細內容。更多資訊請關注PHP中文網其他相關文章!