gpt4 book ai didi

c++ - 将仿函数保留为变量

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:52 25 4
gpt4 key购买 nike

我正在处理一个资源管理类,希望用户向“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com