std:: is_function
|
헤더에 정의됨
<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)
|
타입이 비-유니온 클래스 타입인지 확인합니다
(클래스 템플릿) |