Checks whether T is a function type. Types like std::function, lambdas, classes with overloaded operator() and pointers to functions don't count as function types. Provides the member constant value which is equal to true, if T is a function type. Otherwise, value is equal to false.
If the program adds specializations for std::is_function or std::is_function_v, the behavior is undefined.
std::is_function can be implemented in much simpler ways. Implementations similar to the following one are used by new versions of
,
and
:
template<classT>structis_function:std::integral_constant<bool,!std::is_const<constT>::value&&!std::is_reference<T>::value>{};The implementation shown below is for pedagogical purposes, since it exhibits the myriad kinds of function types.
// primary templatetemplate<class>structis_function:std::false_type{};// specialization for regular functionstemplate<classRet,class...Args>structis_function<Ret(Args...)>:std::true_type{};// specialization for variadic functions such as std::printftemplate<classRet,class...Args>structis_function<Ret(Args......)>:std::true_type{};// specialization for function types that have cv-qualifierstemplate<classRet,class...Args>structis_function<Ret(Args...)const>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)volatile>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)constvolatile>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)const>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)volatile>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)constvolatile>:std::true_type{};// specialization for function types that have ref-qualifierstemplate<classRet,class...Args>structis_function<Ret(Args...)&>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)const&>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)volatile&>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)constvolatile&>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)&>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)const&>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)volatile&>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)constvolatile&>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)&&>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)const&&>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)volatile&&>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)constvolatile&&>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)&&>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)const&&>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)volatile&&>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)constvolatile&&>:std::true_type{};// specializations for noexcept versions of all the above (C++17 and later)template<classRet,class...Args>structis_function<Ret(Args...)noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)constnoexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)volatilenoexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)constvolatilenoexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)constnoexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)volatilenoexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)constvolatilenoexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)&noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)const&noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)volatile&noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)constvolatile&noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)&noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)const&noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)volatile&noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)constvolatile&noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)&&noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)const&&noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)volatile&&noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args...)constvolatile&&noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)&&noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)const&&noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)volatile&&noexcept>:std::true_type{};template<classRet,class...Args>structis_function<Ret(Args......)constvolatile&&noexcept>:std::true_type{};