-
std::is_fundamental
: 判断一个类型是否是一个基础类型,基础类型为算术类型,void
, 或者nullptr_t
。
可能的实现为:
template< class T >
struct is_fundamental
: std::integral_constant<
bool,
std::is_arithmetic<T>::value ||
std::is_void<T>::value ||
std::is_same<std::nullptr_t, typename std::remove_cv<T>::type>::value
> {};
当T
为算数类型,void
或者nullptr_t
时,且这些类型可以带有const和volatile的修饰符,value
的值为true
,否则为false
。
代码示例如下:
class A {};
EXPECT_FALSE(std::is_fundamental<A>::value);
EXPECT_TRUE(std::is_fundamental<int>::value);
EXPECT_FALSE(std::is_fundamental<int&>::value);
EXPECT_FALSE(std::is_fundamental<int*>::value);
EXPECT_TRUE(std::is_fundamental<float>::value);
EXPECT_FALSE(std::is_fundamental<float&>::value);
EXPECT_FALSE(std::is_fundamental<float*>::value);
-
std::is_arithmetic
: 判断一个类型是否为算数类型。算数类型包括整型和浮点型(可加const
和volatile
修饰)。
可能的实现为:
template< class T >
struct is_arithmetic : std::integral_constant<bool,
std::is_integral<T>::value ||
std::is_floating_point<T>::value> {};
当T
为算数类型时,value
的值为true
,否则为false
。
代码示例如下:
class A {};
EXPECT_FALSE(std::is_arithmetic<A>::value);
EXPECT_TRUE(std::is_arithmetic<bool>::value);
EXPECT_TRUE(std::is_arithmetic<int>::value);
EXPECT_TRUE(std::is_arithmetic<int const>::value);
EXPECT_FALSE(std::is_arithmetic<int&>::value);
EXPECT_FALSE(std::is_arithmetic<int*>::value);
EXPECT_TRUE(std::is_arithmetic<float>::value);
EXPECT_TRUE(std::is_arithmetic<float const>::value);
EXPECT_FALSE(std::is_arithmetic<float&>::value);
EXPECT_FALSE(std::is_arithmetic<float*>::value);
EXPECT_TRUE(std::is_arithmetic<char>::value);
EXPECT_TRUE(std::is_arithmetic<char const>::value);
EXPECT_FALSE(std::is_arithmetic<char&>::value);
EXPECT_FALSE(std::is_arithmetic<char*>::value);
-
std::is_scalar
: 判断一个类型是否为scaler 类型(标量类型)。scalar type : 可能时带有const
和volatile
修饰的算数类型,指针,指向数据成员的指针,枚举,或者std::nullptr_t
。
可能的实现为:
template< class T >
struct is_scalar : std::integral_constant<bool,
std::is_arithmetic<T>::value ||
std::is_enum<T>::value ||
std::is_pointer<T>::value ||
std::is_member_pointer<T>::value ||
std::is_null_pointer<T>::value> {};
当T
为标量类型时,value
的值为true
,否则为false
。
class cls {};
EXPECT_TRUE(std::is_scalar<int>::value);
EXPECT_FALSE(std::is_scalar<cls>::value);
-
std::is_object
: 判断一个类型是否为对象类型。对象类型是几个类型的统称,即标量类型,数组,联合或者类类型。
可能的实现为:
template< class T>
struct is_object : std::integral_constant<bool,
std::is_scalar<T>::value ||
std::is_array<T>::value ||
std::is_union<T>::value ||
std::is_class<T>::value> {};
代码示例如下:
class cls {};
EXPECT_TRUE(std::is_object<int>::value);
EXPECT_FALSE(std::is_object<int&>::value);
EXPECT_TRUE(std::is_object<cls>::value);
EXPECT_FALSE(std::is_object<cls&>::value);
-
std::is_compound
:判断一个类型是否为组合类型。组合类型为可能被const
和volatile
修饰的数组,函数,对象指针,函数指针,成员对象指针,成员函数指针,引用,类,联合或者枚举。
可能的实现:
template< class T >
struct is_compound : std::integral_constant<bool, !std::is_fundamental<T>::value> {};
代码示例如下:
class cls {};
EXPECT_TRUE(std::is_compound<cls>::value);
EXPECT_FALSE(std::is_compound<int>::value);
-
std::is_reference
:判断一个类型是否为左值引用或者右值引用。
可能的实现:
template <class T> struct is_reference : std::false_type {};
template <class T> struct is_reference<T&>: std::true_type{};
template <class T> struct is_reference<T&&> : std::true_type {};
代码示例如下:
class A {};
EXPECT_FALSE(std::is_reference<A>::value);
EXPECT_TRUE(std::is_reference<A&>::value);
EXPECT_TRUE(std::is_reference<A&&>::value);
EXPECT_FALSE(std::is_reference<int>::value);
EXPECT_TRUE(std::is_reference<int&>::value);
EXPECT_TRUE(std::is_reference<int&&>::value);
-
std::is_member_pointer
: 判断一个类型是否为非静态成员函数或者对象
可能的实现:
template< class T >
struct is_member_pointer_helper : std::false_type{};
template< class T, class U >
struct is_member_pointer_helper<T U::*> : std::true_type{};
template< class T >
struct is_member_pointer :
is_member_pointer_helper<typename std::remove_cv<T>::type> {};
代码示例如下:
class cls {};
EXPECT_TRUE(std::is_member_pointer<int(cls::*)>::value);
EXPECT_FALSE(std::is_member_pointer<int>::value);
(未完待续)
网友评论