c++ sfinae在模板元编程中的高级应用案例

avatar
作者
筋斗云
阅读量:0

  1. 判断类型是否有指定成员函数
#include <iostream>  template <typename T> struct has_member_function_foo { private:     template <typename U>     static auto test(int) -> decltype(std::declval<U>().foo(), std::true_type{});          template <typename>     static std::false_type test(...);      public:     static constexpr bool value = std::is_same_v<decltype(test<T>(0)), std::true_type>; };  struct A {     void foo() {} };  struct B {     // No foo() };  int main() {     std::cout << has_member_function_foo<A>::value << std::endl; // 1     std::cout << has_member_function_foo<B>::value << std::endl; // 0     return 0; } 
  1. 判断类型是否为可调用对象
#include <iostream>  template <typename T> struct is_callable { private:     // SFINAE test     template <typename U>     static auto test(int) -> decltype(std::declval<U>()(), std::true_type{});      template <typename>     static std::false_type test(...);  public:     static constexpr bool value = std::is_same_v<decltype(test<T>(0)), std::true_type>; };  struct F {     void operator()() {} };  int main() {     std::cout << is_callable<F>::value << std::endl; // 1     std::cout << is_callable<int>::value << std::endl; // 0     return 0; } 

这些案例展示了如何使用SFINAE技术来检查类型的特定特征,这是模板元编程中非常有用的一种技服。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!