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中文網其他相關文章!