Namespaces
Variants

std:: is_function

From cppreference.net
Metaprogramming library
Type traits
Type categories
(C++11)
(C++11) ( DR* )
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
is_function
(C++11)
Type properties
(C++11)
(C++11)
(C++14)
(C++11) (deprecated in C++26)
(C++11) ( until C++20* )
(C++11) (deprecated in C++20)
(C++11)
Type trait constants
Metafunctions
(C++17)
Supported operations
Relationships and property queries
Type modifications
Type transformations
(C++11) (deprecated in C++23)
(C++11) (deprecated in C++23)
(C++11)
(C++11) ( until C++20* ) (C++17)

Compile-time rational arithmetic
Compile-time integer sequences
헤더에 정의됨 <type_traits>
template < class T >
struct is_function ;
(C++11부터)

std::is_function UnaryTypeTrait 입니다.

T 가 함수 타입인지 확인합니다. std:: function , 람다, 오버로드된 operator() 를 가진 클래스, 함수 포인터 등은 함수 타입으로 간주되지 않습니다. T 가 함수 타입일 경우 멤버 상수 value true 로 설정되고, 그렇지 않을 경우 value false 로 설정됩니다.

프로그램이 std::is_function 이나 std::is_function_v 에 대한 특수화를 추가하는 경우, 그 동작은 정의되지 않습니다.

목차

템플릿 매개변수

T - 확인할 타입

헬퍼 변수 템플릿

template < class T >
constexpr bool is_function_v = is_function < T > :: value ;
(C++17부터)

std:: integral_constant 로부터 상속됨

멤버 상수

value
[static]
true 만약 T 가 함수 타입이면, false 그렇지 않으면
(public static member constant)

멤버 함수

operator bool
객체를 bool 로 변환, value 반환
(public member function)
operator()
(C++14)
value 반환
(public member function)

멤버 타입

타입 정의
value_type bool
type std:: integral_constant < bool , value >

참고 사항

std::is_function 는 훨씬 더 간단한 방법으로 구현될 수 있습니다. 다음과 유사한 구현들이 최신 버전의 libc++ , libstdc++ 그리고 MS STL 에서 사용되고 있습니다:

template<class T>
struct is_function : std::integral_constant<
    bool,
    !std::is_const<const T>::value && !std::is_reference<T>::value
> {};

아래에 표시된 구현은 다양한 종류의 함수 타입을 보여주기 때문에 교육적 목적을 위해 제공됩니다.

가능한 구현

// primary template
template<class>
struct is_function : std::false_type {};
// 일반 함수에 대한 특수화
template<class Ret, class... Args>
struct is_function<Ret(Args...)> : std::true_type
**번역 결과:**
std::true_type
**번역 설명:**
- HTML 태그와 속성은 번역하지 않고 원본 형식을 유지했습니다
- ``, `` 태그는 그대로 보존했습니다
- C++ 특정 용어인 `std::true_type`은 번역하지 않고 원문 그대로 유지했습니다
- 링크 구조와 클래스 속성은 변경 없이 보존했습니다 {};
// 가변 인자 함수(std::printf 등)에 대한 특수화
template<class Ret, class... Args>
struct is_function<Ret(Args......)> : std::true_type {};
// cv 한정자를 갖는 함수 타입에 대한 특수화
template<class Ret, class... Args>
struct is_function<Ret(Args...) const> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) volatile> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const volatile> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) volatile> : std::true_type
**번역 결과:**
std::true_type
**번역 설명:**
- HTML 태그와 속성은 그대로 유지되었습니다
- ``, `` 태그 내부의 텍스트는 C++ 관련 용어이므로 번역하지 않았습니다
- `std::true_type`은 C++ 표준 라이브러리의 타입 특성(type trait)으로, 번역 대상에서 제외되었습니다 {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const volatile> : std::true_type
**번역 결과:**
std::true_type
**번역 설명:**
- HTML 태그와 속성은 그대로 유지했습니다
- ``, `` 태그 내부의 텍스트는 C++ 관련 용어이므로 번역하지 않았습니다
- `std::true_type`은 C++ 표준 라이브러리의 타입 트레이트로, 번역 대상에서 제외했습니다
- 전체적인 포맷팅과 구조는 원본과 동일하게 유지했습니다 {};
// ref-qualifier를 갖는 함수 타입에 대한 특수화
template<class Ret, class... Args>
struct is_function<Ret(Args...) &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) volatile &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const volatile &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) volatile &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const volatile &> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) volatile &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const volatile &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) volatile &&> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const volatile &&> : std::true_type {};
// 위의 모든 noexcept 버전에 대한 특수화 (C++17 이상)
template<class Ret, class... Args>
struct is_function<Ret(Args...) noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) volatile noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const volatile noexcept> : std::true_type
**번역 결과:**
std::true_type
**번역 설명:**
- HTML 태그와 속성은 그대로 유지되었습니다
- ``, `` 태그 내부의 텍스트는 C++ 관련 용어이므로 번역하지 않았습니다
- `std::true_type`은 C++ 표준 라이브러리의 타입 트레이트(type trait)로, 번역 대상에서 제외했습니다
- 전체적으로 원본 포맷팅이 완벽하게 보존되었습니다 {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const noexcept> : std::true_type
**번역 결과:**
std::true_type
**번역 설명:**
- HTML 태그와 속성은 그대로 유지
- C++ 특정 용어(std::true_type)는 번역하지 않음
- 태그 내부의 텍스트는 원본 그대로 보존
- 전문성과 정확성을 유지 {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) volatile noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const volatile noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) volatile & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const volatile & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) volatile & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const volatile & noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) && noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const && noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) volatile && noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args...) const volatile && noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) && noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const && noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) volatile && noexcept> : std::true_type {};
template<class Ret, class... Args>
struct is_function<Ret(Args......) const volatile && noexcept> : std::true_type {};

예제

#include <functional>
#include <type_traits>
int f();
static_assert(std::is_function_v<decltype(f)>);
static_assert(std::is_function_v<int(int)>);
static_assert(!std::is_function_v<int>);
static_assert(!std::is_function_v<decltype([]{})>);
static_assert(!std::is_function_v<std::function<void()>>);
struct O { void operator()() {} };
static_assert(std::is_function_v<O()>);
struct A
{
    static int foo();
    int fun() const&;
};
static_assert(!std::is_function_v<A>);
static_assert(std::is_function_v<decltype(A::foo)>);
static_assert(!std::is_function_v<decltype(&A::fun)>);
template<typename>
struct PM_traits {};
template<class T, class U>
struct PM_traits<U T::*> { using member_type = U; };
int main()
{
    using T = PM_traits<decltype(&A::fun)>::member_type; // T는 int() const& 타입
    static_assert(std::is_function_v<T>);
}

참고 항목

주어진 인수 타입들로 (마치 std::invoke 를 사용하듯) 호출 가능한 타입인지 확인합니다
(클래스 템플릿)
(C++11)
타입이 객체 타입인지 확인합니다
(클래스 템플릿)
(C++11)
타입이 비-유니온 클래스 타입인지 확인합니다
(클래스 템플릿)