代码之家  ›  专栏  ›  技术社区  ›  Patrick

C++中的可选方法参数,但从被叫方的参数?

  •  1
  • Patrick  · 技术社区  · 14 年前

    在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;
       };
    

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

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

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

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

    4 回复  |  直到 14 年前
        1
  •  1
  •   Sheen    14 年前

    在本例中,我将考虑附加参数的抽象概念,因为它们只用于某些特定的实现。你的界面会变成:

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

    而实现需要额外的参数可以有自己的IObserverArgs实现。然而,这对lambda来说可能不够灵活。

        2
  •  3
  •   Cheers and hth. - Alf    14 年前

    如果不想实现 operator bool

    是的,它有点不同于Java接口,后者不能提供这种功能。

    干杯。,

        3
  •  1
  •   zvrba    14 年前

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

        4
  •  0
  •   log0    14 年前

    你可以考虑 operator() 额外的参数就像你的具体类的另一个功能一样。

    超载 运算符()

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