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

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

DDD
發布: 2024-11-06 00:36:02
原創
466 人瀏覽過

How to Detect Inherited Member Functions Using SFINAE in C  ?

使用SFINAE 檢查繼承的成員函數

SFINAE(替換失敗不是錯誤)是C 語言中的一項強大技術,允許對錶達式進行編譯時求值。它可用於偵測成員函數(包括繼承的成員函數)是否存在。

以下程式碼示範了一種測試繼承的成員函數的方法:

<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::*)(), &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>
登入後複製

輸出:

true
true
false
登入後複製

這種方法利用類別派生和模板元編程來確定給定類型是否繼承方法。 BaseMixin 類別定義所需的方法,而 Base 類別充當從目標類型和 BaseMixin 派生的中間類型。這允許使用 SFINAE 來推斷目標類型上是否存在該方法。

然後 has_foo 類別使用此推導來提供一個編譯時常數,指示該方法是否存在。這允許高效且可擴展的程式碼,可以根據繼承的成員函數的存在或不存在動態調整其行為。

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

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