我正在处理一个资源管理类,希望用户向“ReleaseResource”方法提供仿函数作为资源管理器构造函数的一部分。从那里请求资源时,将提供仿函数作为我将返回的 shared_ptr 的删除器,以便在不再使用资源时调用适当的方法。
我遇到的问题是,这需要我将仿函数存储在我的类中,但我不完全确定该怎么做。通常在使用仿函数时,您可以像这样模板化函数:
template<class MyFunctor> MyMethod(MyFunctor f) {
f();
}
如果您打算在该函数的范围内使用仿函数,这很好,但是由于模板超出了函数的范围,我不确定您将如何指定适当类型的变量来存储仿函数以备后用。
谁能给我指出正确的方向?
最佳答案
template<class MyFunctor> MyMethod(MyFunctor f) {
boost::function<void()> g = f;
g();
}
您传递给 boost::function
的类型是函数类型。例如,int(bool, char)
是返回 int 并接受 bool 和 char 的函数类型。也就是说,如果您想立即构造 shared_ptr,则不需要将仿函数存储在某处(boost::function
需要 new
运算符,甚至尽管对于非常小的仿函数,它会使用特殊技巧来仅使用堆栈分配(小缓冲区优化)):
template<class MyFunctor> MyMethod(MyFunctor f) {
boost::shared_ptr<T> ptr(new T, f);
}
boost::function 是 tr1
的一部分并将成为下一个官方 C++ 标准的一部分。示例:
struct Manager {
template<typename Deleter>
Manager(Deleter d)
:deleter(d) {
}
boost::shared_ptr<Resource> allocate() {
...
return boost::shared_ptr<Resource>(resource, deleter);
}
private:
boost::function<void(Resource *)> deleter;
};
关于c++ - 将仿函数保留为变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/474279/