首页 >后端开发 >C++ >如何使用 SFINAE 检测继承的成员函数?

如何使用 SFINAE 检测继承的成员函数?

Patricia Arquette
Patricia Arquette原创
2024-11-05 13:52:02565浏览

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