gpt4 book ai didi

c++ - 如何为所有非空变量调用方法

转载 作者:太空狗 更新时间:2023-10-29 20:21:02 25 4
gpt4 key购买 nike

给定以下代码:

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 ...

Demo

关于c++ - 如何为所有非空变量调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46420755/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com