判断类型是否有指定成员函数
#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;}判断类型是否为可调用对象#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技术来检查类型的特定特征,这是模板元编程中非常有用的一种技服。


