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

标签 c++ functor

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

相关文章:

c++ - 如何在实现文件中初始化一个 static const set<string>?

c++ - std::for_each + 仿函数给出难以理解的错误

c++ - 理解这个复杂的声明

shm_open : DSO Missing From Command Line 上的 C++ Boost 库 undefined reference

C++ 模板元编程静态类型检查

c++ - 锁定的 'vector' 文件出错

haskell - 应用仿函数和左从

haskell - Control.Lens.Setter将类型包装在仿函数中是否不是多余的?

c++ - Lambda 只是重载了 operator() 的类?

c# - 添加两个功能?