// 检查是否为函数类型
template<typename _Tp>
struct is_function
: public __bool_constant<!(is_const<const _Tp>::value) && !(is_reference<_Tp>::value)>
{ };
std::cout << "is_function test: " << std::endl;
std::cout << "is_function<func> = " << mySTL::is_function<decltype(func)>::value << std::endl;
void (*foo)() = &func;
std::cout << "is_function<foo> = " << mySTL::is_function<decltype(foo)>::value << std::endl;
std::cout << "is_function<test::test_function> = " << mySTL::is_function<decltype(&test::test_function)>::value << std::endl;
std::cout << std::endl;
令人惊讶的是, 这里除了第一个 func 是函数类型之外, 其他都是 false, 也就是说结果上来看, is_function 只能检查普通函数类型, 函数指针, 函数引用等都是不允许的, 对于普通成员函数来说, 我们没法使用 decltype 来进行判断, 因为 decltype 只能接受函数指针, 然后返回一个函数指针类型.