在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表达式中,即使它们对于那个观察者没有意义。
我知道问题可以通过引入一个额外的适配器来解决,但我实际上正在寻找的方法是从被调用方那里获得真正的可选参数。
有关如何以干净而简单的方式解决这个问题的任何建议吗?
答案 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);
};