Boost logo

Boost Users :

From: Sohail Somani (s.somani_at_[hidden])
Date: 2006-11-28 19:09:18


> -----Original Message-----
> From: boost-users-bounces_at_[hidden]
> [mailto:boost-users-bounces_at_[hidden]] On Behalf Of mark cox
> Sent: Tuesday, November 28, 2006 2:37 PM
> To: boost-users_at_[hidden]
> Subject: Re: [Boost-users] Suggestion for boost`s smart pointers
>
> wow, this seems like a great idea, a scoped_ptr with deleter
> would be v.useful.
> mark

I've been thinking something like (just something I hacked together just
now). Not sure if there is a nicer way.

#include <string>
#include <cstdio>
#include <iostream>

template<typename T>
struct DeletingDeleter
{
        DeletingDeleter(T * p)
        {
            delete p;
            std::cout << "DeletingDeleter" << std::endl;
        }
};

struct FileCloser
{
    FileCloser(FILE * f)
    {
        std::cout << "Closing file" << std::endl;
        fclose(f);
    }
};

template<typename T, typename Deleter=DeletingDeleter<T> >
struct scoped_ptr
{
    scoped_ptr():p_(0){}
    scoped_ptr(T * p):p_(p){}
    ~scoped_ptr()
    {
        Deleter d(p_);
    }
    T * get() {return p_;}
    // regular stuff
private:
    T * p_;
};

typedef scoped_ptr<FILE,FileCloser> file_ptr;

int main()
{
          scoped_ptr<int> a; // maintain old interface
        scoped_ptr<int> b(new int(5));
        file_ptr p(fopen("myfile.txt","w"));
        fprintf(p.get(),"Hello world!\n");
}


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net