type_traits元编程库学习

type_traits是元编程库的一部分,这个库主要用来判断数据类型,比如,判断类型是否为空,是否为空指针,是否为整型,是否为浮点型是否为数组,是否为枚举类型,是否为联合体,是否为函数,是否为指针,是否为左值引用,是否为右值引用,等等,判断的类型非常多,本篇介绍几个基本的。

基础类型分类

is_void

(C++11)

检查类型是否为 void
(类模板)

is_null_pointer

(C++14)

检查类型是否为 std::nullptr_t
(类模板)

is_integral

(C++11)

检查类型是否为整型
(类模板)

is_floating_point

(C++11)

检查类型是否是浮点类型
(类模板)

is_array

(C++11)

检查类型是否是数组类型
(类模板)

is_enum

(C++11)

检查类型是否是枚举类型
(类模板)

is_union

(C++11)

检查类型是否为联合体类型
(类模板)

is_class

(C++11)

检查类型是否非联合类类型
(类模板)

is_function

(C++11)

检查是否为函数类型
(类模板)

is_pointer

(C++11)

检查类型是否为指针类型
(类模板)

is_lvalue_reference

(C++11)

检查类型是否为左值引用
(类模板)

is_rvalue_reference

(C++11)

检查类型是否为右值引用
(类模板)

is_member_object_pointer

(C++11)

检查类型是否为指向非静态成员对象的指针
(类模板)

is_member_function_pointer

(C++11)

检查类型是否为指向非静态成员函数的指针
(类模板)

1. is_void    检查类型是否为 void

#include 
#include 

using namespace std;

int main()
{
    cout << "std::is_void::value==========" << std::is_void::value << endl;
    cout << "std::is_void::value===========" << std::is_void::value << endl;

    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

2. is_null_pointer    检查类型是否为 std::nullptr_t

#include 
#include 

using namespace std;

int main()
{
    cout << "std::is_null_pointer::value = " << is_null_pointer::value << endl;
    cout << "std::is_null_pointer::value = " << is_null_pointer::value << endl;

    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

3. is_integral    检查类型是否为整型

#include 
#include 

using namespace std;

class A {};

enum E: int {};

template 
T fn(T i)
{
    static_assert (std::is_integral::value, "Integral required.");
    return i;
}

int main()
{
    cout << "std::is_integral::value======= " << std::is_integral::value << endl;
    cout << "std::is_integral::value======= " << std::is_integral::value << endl;
    cout << "std::is_integral::value=== " << std::is_integral::value << endl;
    cout << "std::is_integral::value===== " << std::is_integral::value << endl;
    cout << "std::is_integral::value==== " << std::is_integral::value << endl;
    cout << "fn(123)========================== " << fn(123) << endl;
    //cout << "fn(123.5)======================== " << fn(123.5) << endl; //编译失败

    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

type_traits元编程库学习_第1张图片

4. is_floating_point 检查类型是否是浮点类型

#include 
#include 

using namespace std;

class A {};

int main()
{
    cout << "std::is_floating_point::value====== " << std::is_floating_point::value << endl;
    cout << "std::is_floating_point::value== " << std::is_floating_point::value << endl;
    cout << "std::is_floating_point::value== " << std::is_floating_point::value << endl;
    cout << "std::is_floating_point::value= " << std::is_floating_point::value << endl;
    cout << "std::is_floating_point::value= " << std::is_floating_point::value << endl;
    cout << "std::is_floating_point::value==== " << std::is_floating_point::value << endl;

    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

type_traits元编程库学习_第2张图片

5. is_array    检查类型是否是数组类型

#include 
#include 

using namespace std;

class A {};

int main()
{
    cout << "std::is_array::value============ " << std::is_array::value << endl;
    cout << "std::is_array::value========== " << std::is_array::value << endl;
    cout << "std::is_array::value========= " << std::is_array::value << endl;
    cout << "std::is_array::value======== " << std::is_array::value << endl;
    cout << "std::is_array::value========== " << std::is_array::value << endl;
    cout << "std::is_array::value======== " << std::is_array::value << endl;
    cout << "std::is_array::value======= " << std::is_array::value << endl;
    cout << "std::is_array>::value= " << std::is_array>::value << endl;

    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

type_traits元编程库学习_第3张图片

6. is_enum    检查类型是否是枚举类型

#include 
#include 

using namespace std;

class A {};

enum E {};

enum class Ec: int {};

int main()
{
    cout << "std::is_enum::value====== " << std::is_enum::value << endl;
    cout << "std::is_enum::value====== " << std::is_enum::value << endl;
    cout << "std::is_enum::value===== " << std::is_enum::value << endl;
    cout << "std::is_enum::value==== " << std::is_enum::value << endl;

    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

type_traits元编程库学习_第4张图片

7. is_union    检查类型是否为联合体类型

#include 
#include 

using namespace std;

class A {};

typedef union {
    int a;
    float b;
} B;

class C {
    B d;
};

int main()
{
    cout << "std::is_union::value======== " << std::is_union::value << endl;
    cout << "std::is_union::value======== " << std::is_union::value << endl;
    cout << "std::is_union::value======== " << std::is_union::value << endl;
    cout << "std::is_union::value====== " << std::is_union::value << endl;

    cout << "Hello World!" << endl;
    return 0;
}

 运行结果:

type_traits元编程库学习_第5张图片

8. is_class    检查类型是否非联合类类型

#include 
#include 

using namespace std;

struct A { };

class B { } ;

enum class C { };


int main()
{
    cout << "std::is_class::value========== " << std::is_class::value << endl;
    cout << "std::is_class::value========== " << std::is_class::value << endl;
    cout << "std::is_class::value========== " << std::is_class::value << endl;
    cout << "std::is_class::value======== " << std::is_class::value << endl;

    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

type_traits元编程库学习_第6张图片

9. is_function    检查是否为函数类型

#include 
#include 

using namespace std;

struct A {
    int fun() const &;
};

template
struct PM_traits { };

template
struct PM_traits {
    using member_type = U;
};

int f();

int main()
{
    cout << "std::is_function::value================= " << std::is_function::value << endl;
    cout << "std::is_function::value========== " << std::is_function::value << endl;
    cout << "std::is_function::value======= " << std::is_function::value << endl;
    cout << "std::is_function::value=============== " << std::is_function::value << endl;
    using T = PM_traits::member_type; //T为int() const&
    cout << "std::is_function::value================= " << std::is_function::value << endl;

    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

type_traits元编程库学习_第7张图片

10. is_pointer    检查类型是否为指针类型

#include 
#include 

using namespace std;

struct A {
    int fun() const &;
};

int main()
{
    cout << "std::is_pointer::value ================= " << is_pointer::value << endl;
    cout << "std::is_pointer::value =============== " << is_pointer::value << endl;
    cout << "std::is_pointer::value =============== " << is_pointer::value << endl;
    cout << "std::is_pointer::value =============== " << is_pointer::value << endl;
    cout << "std::is_pointer::value ============= " << is_pointer::value << endl;
    cout << "std::is_pointer::value ============ " << is_pointer::value << endl;
    cout << "std::is_pointer::value =========== " << is_pointer::value << endl;
    cout << "std::is_pointer::value ========= " << is_pointer::value << endl;
    cout << "std::is_pointer::value = " << is_pointer::value << endl;

    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

type_traits元编程库学习_第8张图片

11. is_lvalue_reference    检查类型是否为左值引用

#include 
#include 

using namespace std;

class A { };

int main()
{   
    cout << "std::is_lvalue_reference::value====== " << std::is_lvalue_reference::value << endl;
    cout << "std::is_lvalue_reference::value===== " << std::is_lvalue_reference::value << endl;
    cout << "std::is_lvalue_reference::value==== " << std::is_lvalue_reference::value << endl;
    cout << "std::is_lvalue_reference::value==== " << std::is_lvalue_reference::value << endl;
    cout << "std::is_lvalue_reference::value=== " << std::is_lvalue_reference::value << endl;
    cout << "std::is_lvalue_reference::value== " << std::is_lvalue_reference::value << endl;

    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

type_traits元编程库学习_第9张图片

12. is_rvalue_reference    检查类型是否为右值引用

#include 
#include 

using namespace std;

class A { };

int main()
{
    cout << "std::is_rvalue_reference::value====== " << std::is_rvalue_reference::value << endl;
    cout << "std::is_rvalue_reference::value===== " << std::is_rvalue_reference::value << endl;
    cout << "std::is_rvalue_reference::value==== " << std::is_rvalue_reference::value << endl;
    cout << "std::is_rvalue_reference::value==== " << std::is_rvalue_reference::value << endl;
    cout << "std::is_rvalue_reference::value=== " << std::is_rvalue_reference::value << endl;
    cout << "std::is_rvalue_reference::value== " << std::is_rvalue_reference::value << endl;

    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

type_traits元编程库学习_第10张图片

13. is_member_object_pointer    检查类型是否为指向非静态成员对象的指针

#include 
#include 

using namespace std;

int main()
{
    class cls {};
    std::cout << (std::is_member_object_pointer::value
                     ? "T is member object pointer"
                     : "T is not a member object pointer") << endl;
    std::cout << (std::is_member_object_pointer::value
                     ? "T is member object pointer"
                     : "T is not a member object pointer") << endl;

    cout << "Hello World!" << endl;
    return 0;
}

运行结果:

14. is_member_function_pointer    检查类型是否为指向非静态成员函数的指针

#include 
#include 

using namespace std;

class A {
public:
    void member() { }
};

int main()
{
    // 若 A::member 是数据成员而非函数,则在编译时失败
    static_assert(std::is_member_function_pointer::value,
                  "A::member is not a member function.");

    cout << "Hello World!" << endl;
    return 0;
}

参考:

标准库头文件 - cppreference.com

你可能感兴趣的:(STL,stl,c++标准库)