如何使用委托来抽象子类中调用基成员的方式

How to use delegates to abstract the way of calling base members in subclasses?

本文关键字:调用 成员 方式 子类 何使用 抽象      更新时间:2023-10-16

我正在使用以下类设计,并希望通过使用某种委托/成员指针在每个转发方法调用中摆脱相同的 for 循环。这在某种程度上可能吗?

class Type
{
  void func_v();
  // more methods ...
  bool func_b();
  // ...
  unsigned func_u();
  // ...  
}
class MultiType : public Type
{
  void func_v() override
  {
    for(Type* type : _typeVec)
      type->func_v();
  }
  bool func_b() override
  {
    bool result = true;
    for(Type* type : _typeVec)
      result = result && type->func_b();
    return result;
  }
  unsigned func_u() override
  {
    int count = 0;
    for(Type* type : _typeVec)
      count += type->func_u();
    return count;
  }
  protected:
    std::vector<Type*> _typeVec;
}

我正在寻找类似于以下内容:

class MultiType : public Type
{
  void applyMember(MemberType member)
  {
    for(Type* type : _typeVec)
      // how to deal with varying parameters and parameter types here?
      type->member(...)
    // how to deal with varying return values and processing strategies to combine those?
  }
  void func_v() override
  {
    applyMember(&Type::func_v);
  }
  bool func_b() override
  {
    applyMember(&Type::func_b);
  }
  unsigned func_u() override
  {
    applyMember(&Type::func_u);
  }
  protected:
    std::vector<Type*> _typeVec;
}

由于您所有的示例函数都执行不同的操作,因此我建议您研究累积和for_each算法。

你可以用这样的东西替换你的原始循环:

 bool func_b() override
 {
     return std::accumulate(_typeVec.begin(), _typeVec.end(), true, [](const bool &result, const Type *t) {
         return result && type->func_b();
     });
 }
 void func_v() override
 {
      std::for_each(_typeVec.begin(), _typeVec.end(), [](Type *type){type->func_v()});
 }

您问题中的"我正在寻找什么..."部分不起作用。例如,func_b不返回任何值。即使你可以使用模板函数和 lambda 的组合来做类似的事情,你也会在所有函数(局部变量声明、归约机制return语句)中具有相同的独立部分。您唯一可以抽象的就是for循环,但这只是您将用另一行替换的单行。

这样做是没有意义的。

根据我对你的问题的理解,你会想在每个对象上调用相同的方法,并可能使用相同的参数。

例如,在生产代码中,func_v将采用参数。这可能与可能不采用参数的func_b不同。

让我们假设func_v接受一个整数。

在这种情况下,这是真的吗?

MultiType::func_v(int value) {
    for (Type* type : _typeVec)
        type->func_v(value); //note: same value being passed to all
}

您可能希望在此处使用函子。但是,我认为这不适用于多个返回值。

函子可用于聚合值。这是你想做的吗?

忘记抽象循环,您将如何从上面的func_v返回多个值?

因此,如果返回多个值不是问题,则函子可以是您想要做的。

不过,这可能工作量太大而太少。您必须找出在您的生产代码中是否值得。