作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
给定以下代码:
class A {
void DoStuff1(int x);
void DoStuff2(float y);
void DoStuff3(int a, float b);
void DoStuff4(int c);
void DoStuff4(float c);
void ForEachChild(auto method);
A* children[4];
}
以便在其他方法中我可以调用:
ForEachChild(DoStuff1(10));
ForEachChild(DoStuff2(5.0f));
ForEachChild(DoStuff3(15, 12.0f));
DoStuff4(...)
重载也不错,但不是严格需要或者,如果可能的话:
ForEachChild()->DoStuff1(10);
ForEachChild()
将遍历 children
列表,对于每个非空指针,将调用它被要求调用的方法,并使用它简单转发的变量继续。
我必须为所有 child 做很多事情,我不想在所有这些地方都添加循环,我希望代码尽可能保持可读性。
编辑。添加了有关 DoStuff3()
的内容,以明确方法的参数数量不固定。和 DoStuff4()
。
最佳答案
您可以使用成员函数模板。
class A {
void DoStuff1(int x);
void DoStuff2(float y);
template<typename... T, typename... U>
void ForEachChild(void (A::*method)(T...), U&&... x){
for(auto child : children)
if(child) (child->*method)(std::forward<U>(x)...);
}
A* children[4];
}
并用作:
object.ForEachChild(&A::DoStuff1, 10);
object.ForEachChild(&A::DoStuff2, 3.1416);
object.ForEachChild(&A::DoStuff3, 3, 546.353);
object.ForEachChild(static_cast<void(A::*)(int)>(&A::DoStuff4), 3);
object.ForEachChild(static_cast<void(A::*)(float)>(&A::DoStuff4), 3);
请注意,您需要强制转换才能通过 address of an overloaded function ...
关于c++ - 如何为所有非空变量调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46420755/
我是一名优秀的程序员,十分优秀!