具有任何返回类型和任何参数的派生函数

时间:2009-05-05 17:08:56

标签: c++ templates inheritance functor

我有一个使用仿函数作为工作单元的类。它在Run()方法中接受对仿函数的引用。为了允许这个类在任何仿函数上运行,所有这些仿函数都必须来自我的基类仿函数类,如下所示:

class baseFunctor{

public:
    virtual void operator()()=0;
    virtual baseFunctor Clone()=0;
};

这很有效,但显然它限制了这些仿函数使用一个返回void并且不接受任何参数的运算符方法。我需要能够在我的班级中接受一个可以接受任何类型参数并返回任何内容的仿函数。它显然是可行的,但我似乎找不到办法做到这一点。我已经考虑过使用模板,多重继承,但是我不断受到这样一个事实的阻碍:需要运行这个仿函数的类必须能够接受任何类型,所以会接受基类类型,因此不会知道实际的类型仿函数。

任何关于要看什么途径的建议都会受到赞赏。

7 个答案:

答案 0 :(得分:2)

调用函子的类如何知道要提供哪些参数以及如何处理返回值?

答案 1 :(得分:1)

如果您愿意使用Boost库(www.boost.org),您可能会发现特别感兴趣的Boot.Bind和Boost.Function。我过去曾经用它们来实现与你所讨论的内容非常相似的东西。

如果使用Boost.Bind,则可以对仿函数执行currying,以解释仿函数所期望的参数数量与Run方法期望的参数数量(即零)之间的差异。创建仿函数的代码必须将任何参数绑定到特定值,从而创建一个可以传递给Run()的零参数仿函数。

MV

答案 2 :(得分:1)

所以,如果我正确读到这个,你就会有一个“访客模式”。你抬头看起来可能是一件好事。

某人需要知道仿函数为其提供参数的类型。通常使用仿函数,参数被分配给派生类的字段,而operator()将对这些字段进行操作。也就是说,调用函子并且对它没有任何了解的哑方法被更有知识的人给予闭包(方法加上一个类中的参数)。

如果你确实想要在operator()中使用多个参数的泛型仿函数,那么模板化将会让你在那里,但你需要每个参与者。

答案 3 :(得分:1)

我同意尼尔。您的主类必须知道要传递的参数以及期望从这些函子获得的返回值。你能不能将你的“functor”类型转换为适当的类,并使用必要的参数和返回值来支持该函数?

class baseFunctor
{
};

class functor1x2: public baseFunctor
{
public:
    virtual void* execute(void*, void*);

}

class MainClass
{
public:
   void Execute(baseFunctor* ipFunctor)
   {
      functor1x2* lpFunctor1x2 = dynamic_cast<functor1x2*>(ipFunctor);
      if(lpFunctor1x2)
      {
         lpFunctor1x2->execute(NULL, NULL);
      }
   }
}

我不确定使用这种方法可以实现什么,而不像Drew指出的那样,使用访问者模式无法轻松完成。

答案 4 :(得分:0)

为什么要退回仿函数?你也存放一些州吗?更多细节将非常受欢迎,因为不清楚你想要做什么。

如果您打算使用继承,请查找协变返回类型(以及Virtual Constructor idiom)。

现在,问题的关键:问题实际上不是传递函数,而是函数应用程序。您可能还需要查看boost::lambdaboost::parameter

答案 5 :(得分:0)

我认为你想要一个省略号参数,比如用于C ++的varargs。

答案 6 :(得分:0)

也许std :: tr1 :: function对你很有意思?