types_is_member_function_pointer
types_is_member_function_pointer (멤버 함수 포인터 판별)
std::is_member_function_pointer는 주어진 타입 T가 비정적 멤버 함수 포인터인지 컴파일 타임에 검사하는 UnaryTypeTrait예요. 검사 결과는 멤버 상수 value로 제공되며, 조건을 만족하면 true, 그렇지 않으면 false가 돼요. 이 페이지에서는 템플릿 파라미터, 헬퍼 변수 템플릿, 상속 멤버, 구현 예시를 함께 살펴볼게요.
출처: cppreference
본문
<type_traits> 헤더에 정의됨 |
||
|---|---|---|
template < class T > struct is_member_function_pointer ; |
(C++11부터) |
std::is_member_function_pointer는 UnaryTypeTrait예요.
T가 비정적 멤버 함수 포인터인지 검사해요. T가 비정적 멤버 함수 포인터 타입이면 멤버 상수 value는 true가 되고, 그렇지 않으면 false가 돼요.
프로그램에서 std::is_member_function_pointer 또는 std::is_member_function_pointer_v에 대한 특수화를 추가하면 동작이 정의되지 않아요(undefined behavior).
템플릿 파라미터
| T | - | 검사할 타입 |
|---|
헬퍼 변수 템플릿
template < class T > constexpr bool is_member_function_pointer_v = is_member_function_pointer < T >:: value ; |
(C++17부터) |
|---|
C++17부터는 is_member_function_pointer_v<T> 형태로 더 간편하게 값을 참조할 수 있어요.
std::integral_constant로부터 상속됨
멤버 상수
value [static] |
T가 멤버 함수 포인터 타입이면 true, 아니면 false (public static member constant) |
|---|
멤버 함수
operator bool |
객체를 bool로 변환하고 value를 반환해요 (public member function) |
|---|---|
operator() (C++14) |
value를 반환해요 (public member function) |
멤버 타입
| Type | Definition |
|---|---|
value_type |
bool |
type |
std::integral_constant<bool, value> |
가능한 구현
template < class T > struct is_member_function_pointer_helper : std :: false_type {};
template < class T , class U > struct is_member_function_pointer_helper < T U ::*> : std :: is_function < T > {};
template < class T > struct is_member_function_pointer : is_member_function_pointer_helper < typename std :: remove_cv < T >:: type > {};
첫 번째 템플릿은 기본적으로 std::false_type을 상속받아요. 두 번째 템플릿은 T U::* 형태의 멤버 포인터에 대해 T가 함수 타입인지 std::is_function으로 확인해요. 마지막으로 std::remove_cv로 cv 한정자를 제거한 타입을 헬퍼에 전달해서 최종 결과를 얻어요.
예제
#include <type_traits>
class A
{
public:
void member() {}
};
int main()
{
// fails at compile time if A::member is a data member and not a function
static_assert(std::is_member_function_pointer<decltype(&A::member)>::value,
"A::member is not a member function.");
}
decltype(&A::member)는 void (A::*)() 타입이므로 value가 true가 되어 static_assert를 통과해요. 만약 member가 데이터 멤버였다면 컴파일 타임에 오류가 발생했을 거예요.
같이 보기
is_pointer (C++11) |
타입이 포인터 타입인지 확인해요 (class template) |
|---|---|
is_member_object_pointer (C++11) |
타입이 비정적 멤버 객체 포인터인지 확인해요 (class template) |
is_member_pointer (C++11) |
타입이 비정적 멤버 함수 또는 객체 포인터인지 확인해요 (class template) |
is_member_function_pointer_type (C++26) |
리플렉션이 멤버 함수 포인터 타입을 나타내는지 확인해요 (function) |