源码实现:


// 检查是否为函数类型

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 只能接受函数指针, 然后返回一个函数指针类型.