在<type_traits>
中有以下内容:
is_pointer<>
is_function<>
is_member_function_pointer<>
但不包括这个:
is_function_pointer<>
为什么会这样呢?
在<type_traits>
中有以下内容:
is_pointer<>
is_function<>
is_member_function_pointer<>
但不包括这个:
is_function_pointer<>
为什么会这样呢?
#include <iostream>
#include <type_traits>
typedef void (*fptr)();
typedef int* intptr;
int main()
{
std::cout << std::is_function<fptr>::value << '\n';
std::cout << std::is_pointer<fptr>::value << '\n';
std::cout << std::is_pointer<intptr>::value << '\n';
}
0
1
1
int*
实际上非常不同。(int*
)可以通过void*
进行可移植的来回转换,但是函数指针不能。 - Ben Voigtis_function_pointer
不存在的原因也是因为有remove_pointer
,这使得它可以表示为is_pointer<T> && is_function<remove_pointer<T>>
。但对于is_member_function_pointer
,则需要remove_member_pointer
,但似乎它并不存在。我想知道为什么呢? - Johannes Schaub - litbU C::*
,它可以产生 U
和 C
。我可以想象 remove_member_pointer<T>::class_type
会产生 C
,而 remove_member_pointer<T>::type
会产生 U
(直观上)。但我可以看出这是有争议的。 - Johannes Schaub - litb看起来这确实是一个奇怪的疏忽。然而,成员指针始终是成员指针类型,不像自由函数可以是指针类型(void(*)()
)或函数类型(void()
)。此外,std::is_pointer
从不对成员指针类型返回true。
但是,如果您需要此功能,以下是一种实现方式:
template<typename testType>
struct is_function_pointer
{
static const bool value =
std::is_pointer<testType>::value ?
std::is_function<typename std::remove_pointer<testType>::type>::value :
false;
};
value
不是一个整数常量表达式。请将该测试放入结构体中,并使 value
成为 const
。 - Xeo
is_pointer
在函数指针的情况下返回 true,但不适用于成员函数指针。因此is_member_function_pointer
是必要的补充,而is_function_pointer
则不是。并不是说它没有用处,只是要提到这个区别。 - Dennis Zickefoose