c – 这被认为是SFINAE吗?

前端之家收集整理的这篇文章主要介绍了c – 这被认为是SFINAE吗?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我问了一个星期前的一个问题,询问我如何才能简单地实例化一个类模板,只要它具有特定的成员函数的类型.在我的答案中,我得到了一个复杂的解决方案.但是后来我试图自己做.我只是想知道如果这足以计算出一个给定的类型T,则具有一个名为f的void函数取0个参数.
  1. #include <type_traits>
  2. #include <utility>
  3.  
  4. template <typename T,typename = void>
  5. struct has_f : std::false_type { };
  6.  
  7. template <typename T>
  8. struct has_f<
  9. T,decltype(std::declval<T>().f(),void())> : std::true_type { };
  10.  
  11. template <typename T,typename = typename std::enable_if<has_f<T>::value>::type>
  12. struct A { };
  13.  
  14. struct B
  15. {
  16. void f();
  17. };
  18.  
  19. struct C { };
  20.  
  21. template class A<B>; // compiles
  22. template class A<C>; // error: no type named ‘type’
  23. // in ‘struct std::enable_if<false,void>’

如果是这样,为什么其他答案在this thread?这么复杂

解决方法

是的,你已经解决了最简单,最惯用的风格的C 11 SFINAE.

请注意,您没有检查返回类型是否为void,它是非静态成员,也没有参数. f只需调用即可.甚至可能是一个函子.

要检查一个无效的非静态函数返回void,请使用

  1. template <typename T>
  2. struct has_f<T,decltype(void( static_cast< void (T::*)( void ) >( &T::f ) )) >
  3. : std::true_type {};
  4.  
  5. template <typename T>
  6. struct has_f<T,decltype(void( static_cast< void (T::*)( void ) const >( &T::f ) )) >
  7. : std::true_type {};

猜你在找的C&C++相关文章