#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.