using lamda to make RAII idom

来源:互联网 发布:mac只装win10单系统 编辑:程序博客网 时间:2024/05/29 16:06

#define _CRT_SECURE_NO_WARNINGS#include <cstdlib>#include <cstdio>#include <iostream>template<typename ctor, typename dtor, typename T>class scoped_object{  public:    scoped_object(ctor c, dtor d): t_(c()), dtor_(d){}    ~scoped_object()    {      dtor_(t_);    }    operator T& ()    {      return t_;    }  private:    T t_;    dtor dtor_;};#define def_scoped_object(ctor, dtor, obj)  \scoped_object<decltype(ctor), decltype(dtor), decltype(ctor())> obj(ctor, dtor);int main(){  //mollac and freee  {    auto ctor = [](){ return (int*)malloc(5* sizeof(int));};    auto dtor = [](int* p){ free(p);};    def_scoped_object(ctor, dtor, p);    for(int i = 0; i < 5; ++i)    {      p[i] = i*i;    }    for(int i = 0; i < 5; ++i)    {      std::cout << p[i] << std::endl;    }  }  //fopen fclose  {    auto ctor = [](){ return fopen("input.txt", "r");};    auto dtor = [](FILE* p){ if(p) fclose(p);};    def_scoped_object(ctor, dtor, fs);    int ch;    if(fs)    {      while((ch=fgetc(fs)) != EOF)      {        std::cout <<(char)ch << std::endl;      }    }  }  return 0;}


The code is not beautifull yet, but it works. The RAII is pretty usefull with C resource management API to have a exception-safe  function.

0 0
原创粉丝点击