On Fri, Aug 19, 2011 at 7:00 AM, Brian Allison <brian.w.allison@gmail.com> wrote:
Is there a way to generalize the return type so that ScopedResource could be in a library and the user could use it for pairing two functions that have int and void return types respectively?
? I don't think that's necessary. The following still works for me (g++): #include <iostream> #include <boost/function.hpp> #include <boost/bind.hpp> void acquire_fixed() { std::cout << "Acquiring fixed resource\n"; } int iacquire_fixed() { int ret(34); std::cout << "Acquiring fixed resource, returning " << ret << '\n'; return ret; } void release_fixed() { std::cout << "Releasing fixed resource\n"; } void acquire(const std::string& resource) { std::cout << "Acquiring " << resource << '\n'; } int iacquire(const std::string& resource) { int ret(17); std::cout << "Acquiring " << resource << ", returning " << ret << '\n'; return ret; } void release(const std::string& resource) { std::cout << "Releasing " << resource << '\n'; } class ScopedResource { public: typedef boost::function<void()> ResourceFunc; ScopedResource(const ResourceFunc& acq, const ResourceFunc& rel): mRelease(rel) { acq(); } virtual ~ScopedResource() { mRelease(); } private: ResourceFunc mRelease; }; int main(int argc, char *argv[]) { { ScopedResource fixed(acquire_fixed, release_fixed); std::cout << "during acquire_fixed()\n"; } { ScopedResource fixed(iacquire_fixed, release_fixed); std::cout << "during iacquire_fixed()\n"; } { ScopedResource something(boost::bind(acquire, "something"), boost::bind(release, "something")); std::cout << "during acquire('something')\n"; } { ScopedResource something(boost::bind(iacquire, "something"), boost::bind(release, "something")); std::cout << "during iacquire('something')\n"; } return 0; }