C++ 保留函子作为变量

C++ 保留函子作为变量,c++,functor,C++,Functor,我正在处理一个资源管理类,希望用户向“ReleaseResource”方法提供一个函子,作为资源管理器构造函数的一部分。从那里,当请求资源时,functor将作为我将返回的共享\u ptr的删除器提供,以便在不再使用资源时调用适当的方法 我遇到的问题是,这需要我在类中存储函子,我不完全确定如何做到这一点。通常,在使用函子时,您可以像这样对函数进行模板化: template<class MyFunctor> MyMethod(MyFunctor f) { f(); } 模板M

我正在处理一个资源管理类,希望用户向“ReleaseResource”方法提供一个函子,作为资源管理器构造函数的一部分。从那里,当请求资源时,functor将作为我将返回的共享\u ptr的删除器提供,以便在不再使用资源时调用适当的方法

我遇到的问题是,这需要我在类中存储函子,我不完全确定如何做到这一点。通常,在使用函子时,您可以像这样对函数进行模板化:

template<class MyFunctor> MyMethod(MyFunctor f) {
    f();
}
模板MyMethod(MyFunctor f){
f();
}
如果您打算在该函数的作用域中使用函子,这非常好,但是由于模板超出了该函数的作用域,我不确定您将如何指定适当类型的变量来存储函子以供以后使用


有人能给我指出正确的方向吗?

不确定这是否有帮助,但请注意boost::shared\u ptr具有构造函数重写,允许用户包括自定义取消分配(以及自定义分配器,如果需要)。这可能足以满足您的需要(如果我正确阅读了您的用例,那么在设计时就考虑到了这一点)

::函数是下一个官方C++标准的一部分,将成为下一个官方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;
};
结构管理器{ 模板 经理(删除d) :deleter(d){ } boost::shared_ptr allocate(){ ... 返回boost::shared_ptr(资源,删除器); } 私人: boost::函数删除器; };
有两种方法,这两种方法都可以简化为模板化类

template <MyFunctor>
class MyClass
{
   MyFunctor   func;
  public:
    MyClass(MyFunctor f) :func(f)
    { }


    MyMethod() 
   {
       func();
   }
}
模板
类MyClass
{
MyFunctor func;
公众:
MyClass(MyFunctor f):func(f)
{ }
MyMethod()
{
func();
}
}
这需要您知道函子的类型。为了避免这种情况,我们可以使用工厂:

 template<MyFunctor>
 MyClass<MyFunctor>  MakeFunctorClass(MyFunctor f)
 {     
     return MyClass<MyFunctor>(f);       
 }
模板
MyClass MakeFunctorClass(MyFunctor f)
{     
返回MyClass(f);
}
或者,由于在所有可能性中,大部分函子签名都是相同的,只有一小部分发生了变化,因此我们可以使用:

template <MyType>
class MyClass
{
   typedef std::binary_function<MyType, MyType, bool>  MyFunctor;
   MyFunctor func;
  public:


    MyMethod(MyFunctor f) 
   {
       func = f;
       func();
   }
}
模板
类MyClass
{
typedef std::二进制函数MyFunctor;
MyFunctor func;
公众:
MyMethod(MyFunctor f)
{
func=f;
func();
}
}
这使得使用更简单一些:

 bool AreEqual(int, int); 
 MyClass<int> myc;
 myc.MyMethod(AreEqual);
bool AreEqual(int,int);
myc类;
myc.MyMethod(AreEqual);

我已经意识到这一点,并在上面的示例中使用它。我需要知道的是如何存储传递给它的参数。太棒了!这正是我想要的。非常感谢你!但这不是“二进制函数”的工作原理。二进制函数是一个类型特征属性,而不是一个接口。它没有应用运算符,因此语句“func()”无效,即使您提供了参数。请参阅关于boost::function或tr1::function的其他答案。这就是为什么我特别说“我不保证我给出的二进制函数typedef会工作”。我很确定不会,但我知道有一种标准类型可以。
template <MyType>
class MyClass
{
   typedef std::binary_function<MyType, MyType, bool>  MyFunctor;
   MyFunctor func;
  public:


    MyMethod(MyFunctor f) 
   {
       func = f;
       func();
   }
}
 bool AreEqual(int, int); 
 MyClass<int> myc;
 myc.MyMethod(AreEqual);