如何使用委托来抽象子类中调用基成员的方式
How to use delegates to abstract the way of calling base members in subclasses?
我正在使用以下类设计,并希望通过使用某种委托/成员指针在每个转发方法调用中摆脱相同的 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返回多个值?
因此,如果返回多个值不是问题,则函子可以是您想要做的。
不过,这可能工作量太大而太少。您必须找出在您的生产代码中是否值得。
相关文章:
- 无法调用成员函数,尝试正确执行此操作仍然失败
- 在 transform() 中调用成员函数
- C++::在构造函数退出之前通过指针调用成员函数
- 为什么我可以通过野生指针调用成员函数
- 从 Qt 中的信号调用成员函数的问题
- 调用C++成员函数指针,而不知道哪个类
- 如何从嵌套在命名空间中的类调用成员函数?
- 无法在非成员函数中调用成员函数
- 为什么分配了 nullptr 的指针可以调用成员函数?
- 通过带有成员函数指针的 QHash 调用成员函数的正确方法
- 使用可变参数模板调用成员函数
- 调用成员对象的构造函数
- 有没有办法在没有括号的情况下在C++中调用成员的getter/setter?
- 如何调用成员初始化器列表中参考成员的构造函数
- 使用按引用调用时,不能在没有对象的情况下调用成员函数 const
- 如果绝对没有调用成员函数,是否允许使用不完整类型的向量?如果是这样,从什么时候开始
- 在另一个成员函数中调用成员函数时'int'之前的预期主表达式
- 为什么调用成员函数不调用该对象的 ODR-USE?
- 如何在模板参数中调用成员
- 是否可以使用 EXPECT_CALL 来验证模拟对象的构造函数是否在某些时候调用成员函数?