用于检测继承成员函数的 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 (& chk(type_check<Sig, &V::foo>*))[1]; template <typename > static char (& 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::*)(), &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中文网其他相关文章!