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中文网其他相关文章!