首頁  >  文章  >  後端開發  >  如何使用 SFINAE 偵測繼承的成員函數?

如何使用 SFINAE 偵測繼承的成員函數?

Patricia Arquette
Patricia Arquette原創
2024-11-05 13:52:02527瀏覽

How to Detect Inherited Member Functions Using SFINAE?

用於偵測繼承成員函數的 SFINAE

可以使用替換失敗不是錯誤 (SFINAE) 技術來偵測固有成員函數。然而,標準 SFINAE 實施可能無法達到要求。本文探討了一種檢測繼承的成員函數的解決方案。

考慮以下程式碼:

<code class="cpp">#include <iostream>

template<typename T, typename Sig>                                 
struct has_foo {                     
    template <typename U, U> struct type_check;
    template <typename V> static char (&amp; chk(type_check<Sig, &amp;V::foo>*))[1];
    template <typename  > static char (&amp; chk(...))[2]; 
    static bool const value = (sizeof(chk<T>(0)) == 1);
};

struct A {
    void foo();
};

struct B : A {};

int main()
{
    using namespace std;
    cout << boolalpha << has_foo<A, void (A::*)()>::value << endl; // true
    cout << boolalpha << has_foo<B, void (B::*)()>::value << endl; // false
}</code>

此程式碼利用 SFINAE 來偵測成員函數。但是,它無法偵測 B 中繼承的成員函數。

要解決此問題,可以使用以下程式碼庫:

<code class="cpp">#include <iostream>

template <typename Type> 
class has_foo
{ 
   class yes { char m;}; 
   class no { yes m[2];}; 
   struct BaseMixin 
   { 
     void foo(){} 
   }; 
   struct Base : public Type, public BaseMixin {}; 
   template <typename T, T t>  class Helper{}; 
   template <typename U> 
   static no deduce(U*, Helper<void (BaseMixin::*)(), &amp;U::foo>* = 0); 
   static yes deduce(...); 
public: 
   static const bool result = sizeof(yes) == sizeof(deduce((Base*)(0))); 
}; 

struct A {
    void foo();
};

struct B : A {};

struct C {};

int main()
{
    using namespace std;
    cout << boolalpha << has_foo<A>::result << endl;
    cout << boolalpha << has_foo<B>::result << endl;
    cout << boolalpha << has_foo<C>::result;
}</code>

此版本利用類別繼承並定義一個輔助類別來協助在 SFINAE 檢查中。結果輸出顯示成功偵測到繼承的成員函數。

以上是如何使用 SFINAE 偵測繼承的成員函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn