zoukankan      html  css  js  c++  java
  • 函数指针、类型别名与智能指针

     1 // run in windows: std::system("pause")
     2 #include <cstdlib>
     3 #include <iostream>
     4 #include <memory>
     5 #include <functional>
     6 
     7 using namespace std;
     8 using namespace std::placeholders;
     9 
    10 template <typename T>
    11 using DeleteFunc = void(T*);
    12 
    13 class Deleter;
    14 
    15 template <typename T>
    16 using DeleteMemberFunc = void(__thiscall Deleter::*)(T*)const;
    17 
    18 // normal version
    19 template <typename T>
    20 inline void Delete(T* ptr)
    21 {
    22     cout << "[delete] address: " << ptr << ", value: " << *ptr << endl;
    23     delete ptr;
    24 }
    25 
    26 // caller operator & static member function
    27 class Deleter
    28 {
    29 public:
    30     Deleter() = default;
    31     ~Deleter() = default;
    32     Deleter(const Deleter&) = default;
    33     Deleter(Deleter&&) = default;
    34     Deleter& operator=(const Deleter&) = default;
    35 
    36     template <typename T>
    37     void operator()(T* ptr) const { Delete(ptr); }
    38 
    39     template <typename T>
    40     static void StaticDelete(T* ptr) { ::Delete(ptr); }
    41 } deleter;
    42 
    43 // std::function
    44 function<DeleteFunc<int>> funcobj = &Delete<int>;
    45 function<DeleteFunc<int>> static_funcobj = &Deleter::StaticDelete<int>;
    46 function<DeleteFunc<int>> member_funcobj = bind(&Deleter::operator()<int> , &deleter, _1);
    47 
    48 // lambda
    49 auto lambda_delete = [](int* ptr) { Delete(ptr); };
    50 
    51 using IntSPtr = shared_ptr<int>;
    52 template <typename Func> using IntUPtr = unique_ptr<int, Func>;
    53 
    54 int main(int argc, char* argv[])
    55 {
    56     {
    57         DeleteMemberFunc<int> member_func = &Deleter::operator();
    58 
    59         IntSPtr s1 = make_shared<int>(10);
    60         IntSPtr s2(new int(11), &Delete<int>);
    61         IntSPtr s3(new int(12), Deleter());
    62         IntSPtr s4(new int(13), &Deleter::StaticDelete<int>);
    63         IntSPtr s5(new int(14), funcobj);
    64         IntSPtr s6(new int(15), static_funcobj);
    65         IntSPtr s7(new int(16), member_funcobj);
    66         IntSPtr s8(new int(17), lambda_delete);
    67         int* sp9 = new int(18);
    68         (deleter.*member_func)(sp9);
    69 
    70         unique_ptr<int> u1 = make_unique<int>(20);
    71         IntUPtr<DeleteFunc<int>*> u2(new int(21), &Delete<int>);
    72         IntUPtr<Deleter> u3(new int(22), Deleter());
    73         IntUPtr<DeleteFunc<int>*> u4(new int(23), &Deleter::StaticDelete<int>);
    74         IntUPtr<decltype(funcobj)> u5(new int(24), funcobj);
    75         IntUPtr<decltype(static_funcobj)> u6(new int(25), static_funcobj);
    76         IntUPtr<decltype(member_funcobj)> u7(new int(26), member_funcobj);
    77         IntUPtr<decltype(lambda_delete)> u8(new int(27), lambda_delete);
    78         int* up9 = new int(28);
    79         (deleter.*member_func)(up9);
    80     }
    81 
    82     std::system("pause");
    83     return 0;
    84 }
  • 相关阅读:
    uniapp 小程序分享功能
    uniapp 输入有值后按钮变色
    css 跑马灯
    uniapp 复选框问题
    【Python】where cut query melt函数用法
    【Python】Pivot_table透视表用法及CategoricalDtype自定义排序
    【Python】Merge函数的用法
    【Python】extract及contains方法(正则提取筛选数据)
    Promise
    CSS垂直居中的方法
  • 原文地址:https://www.cnblogs.com/jzincnblogs/p/6680186.html
Copyright © 2011-2022 走看看