C ++中的可选方法参数,但来自被调用方?

时间:2010-10-28 12:37:32

标签: c++ lambda optional-parameters

在C ++中,方法可以有可选参数,如下所示:

void myFunction (int arg1, int arg2=0);

在这种情况下,可以使用1个整数或2个整数调用myFunction。如果省略第二个整数,则传递值0。

我现在正在寻找获得相同功能的方法,但是来自被叫方。假设我有一个需要实现的接口(例如观察者接口)。此时它看起来像这样:

class IObserver
   {
   public:
      virtual bool operator() (OtherClass *instance) = 0;
   };

到目前为止,调用观察者的代码只想传递实例参数。但是,为了实现一些新功能,我想添加一些其他参数,如:

class IObserver
   {
   public:
      virtual bool operator() (OtherClass *instance, int firstOptional, int secondOptional) = 0;
   };

但是,鉴于这些新参数只对少数非常具体的观察者有意义,我不想在其他99%的观察者中添加额外的参数。

为了使情况更复杂,您为观察者提供的代码也接受lambda表达式。所以你可以这样写:

addObserver (observee, [](OtherClass *instance)->bool {/*do something here*/ return true;}

原始签名的简单性使得传递lambda表达式变得简单易行。 有了额外的参数,我现在不得不将这些参数添加到lambda表达式中,即使它们对于那个观察者没有意义。

我知道问题可以通过引入一个额外的适配器来解决,但我实际上正在寻找的方法是从被调用方那里获得真正的可选参数。

有关如何以干净而简单的方式解决这个问题的任何建议吗?

4 个答案:

答案 0 :(得分:3)

如果你不想在实现接口的每个具体类中实现operator bool的重载,那么你可以让接口提供非虚拟重载,将调用转发给单个虚拟成员函数(有很多论据)必须实施。

是的,它与Java接口有点不同,Java接口无法提供这种功能。

另一种方式是,如果你想要,你可以让非虚拟转发器进行条件前检查和/或参数验证,你可以在那里设置断点进行调试。 : - )

干杯&第h。,

答案 1 :(得分:1)

但是你可以在参数的数量和类型上重载operator()。为什么这不令人满意?

答案 2 :(得分:1)

在这种情况下,我会考虑其他参数的抽象概念,因为它们仅用于某些特定实现。您的界面将变为:

class IObserver 
   { 
   public: 
      virtual bool operator() (OtherClass *instance, IObserverArgs* args) = 0;
   }; 

并且实现需要额外的参数可以拥有自己的IObserverArgs实现。但是,这可能对lambda不够灵活。

答案 3 :(得分:0)

您可以将带有额外参数的operator()版本视为具体类的另一个功能。

在需要额外参数的几个具体类中重载operator()

class Observer1
{
public:
   virtual bool operator() (OtherClass *instance);
   bool operator() (OtherClass *instance, int firstOptional, int secondOptional);
};