|
Boost : |
From: Tobias Schwinger (tschwinger_at_[hidden])
Date: 2006-12-01 15:16:36
Sohail Somani wrote:
> Thanks for your reply but the domain of COM objects lends itself well to shared_ptr.
As to scoped_ptr. I don't quite understand the "but" in that sentence.
> I went through the archives after the posts and I have realized that
> scoped_ptr is not changing! I will still disagree that the deleter shouldn't
> be a parameterized type.
What's wrong with:
template<typename T> void free_resource(T* ptr)
{ delete ptr; }
void free_resource(std::FILE* f)
{ std::fclose(f); }
void free_resource(IDispatch * o)
{ o->Release(); }
template<typename T>
struct scoped_ptr
{
// [...]
~scoped_ptr() { free_resource(this->p_); }
// [...]
};
?!
Adding another dummy parameter will make ADL work (see attached file for
demonstration of the technique).
> The only other option is using a type erasure mechanism like shared_ptr which
> is more trouble than its worth for things like deallocating C resources.
I was referring to the file pointer, which is pretty much the only "C resource" I use.
You're right when it comes to malloc/free, of course - but do we really need it?
Regards,
Tobias
#include <iostream>
namespace framework
{
enum adl_hook { use_adl };
template<typename T>
inline void visit(T const & o, adl_hook)
{
std::cout << "default case" << std::endl;
}
}
namespace my_prj
{
struct my_class { };
void visit(my_class const & x, framework::adl_hook)
{
std::printf("my_class\n");
}
}
int main()
{
int a = 1;
my_prj::my_class b;
visit(a, framework::use_adl);
visit(b, framework::use_adl);
return 0;
}
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk