【问题标题】:Repeatedly Running A Function With Different Parameters Each Time每次重复运行不同参数的函数
【发布时间】:2013-11-29 10:09:39
【问题描述】:

目前,我有一个结构体,我用它来创建很多参数,然后我必须在所有参数上运行各种函数。

Function1(Mom.SayHi);
Function1(Mom.BeNice);
Function1(Mom.MindManners);

Function3(Mom.SayHi);
Function3(Mom.BeNice);
Function3(Mom.MindManners);

等等,问题是我有一个很长的参数列表,可能会扩展。有没有办法在结构中的所有内容上运行指定的函数,比如

xAllTheY(FunctionWut,AllParams){
    FunctionWut(AllParams);
}

看来我不能使用函数作为参数。可能是因为我使用了 void 函数。我是否缺少星号 (*) 或其他内容?

我使用的是 MS Visual C++ 2010 Express,我不关心可移植性。

【问题讨论】:

  • 我想象这种语言逻辑控制结构称为“循环”。你可能想循环到那个。
  • @WhozCraig 你知道有一种方法可以让循环每次都以不同的方式运行吗?

标签: c++ function visual-c++ struct void


【解决方案1】:

我相信有几种方法可以解决这个任务。

如果您知道所有函数都具有相同的签名,则可以使用函数指针(或成员函数指针)和潜在参数数组。然后迭代潜在参数数组并将它们传递给函数指针。例如:

void exec(void (*fun)(const std::string&), const std::vector<std::string>& args)
{
    for (auto& v: args) { fun(v); }
}

您可以使用接受函数和参数列表的模板函数(或仿函数)来获得相同的结果(实际上,由于函数指针优化,结果会更好)。这样你就可以对同一段代码采用任意函数;此外,您可以通过使用 std::bind 来采用接受多个参数的函数。例如:

template <typename Fun, typename ArgsContainer>
void exec(Fun fun, const ArgsContainer& args)
{
    for (auto& v: args) { fun(v); }
}

其实这已经被for_each算法完成了:

for_each(args.begin(), args.end(), &func);

最后但同样重要的是,您可以使用宏。有时使用宏+包含来迭代某些东西是可以接受的技术。例如:

void exec(void (*fun)(const std::string&))
{
    #define RUN(arg) fun((arg))
    #include "run_cases.h"
    #undef RUN
}

run_cases.h 的样子:

RUN("test1");
RUN(2.0f);
RUN(anything_that_is_acceptable_as_any_function_overload);

不,你不能只传递结构的名称,假设编译器会用它的成员替换它。您必须明确输入它们;实际上,您不希望使用每个结构成员,隐式成员是排除的良好候选者。

【讨论】:

    【解决方案2】:

    C++ 没有在结构的每个字段上运行函数的任何特性。您需要为每个字段显式编写调用。

    原因是如果将 C++ 与最近的语言进行比较,它是一种“低级语言”。它倾向于将源代码中的内容翻译成指令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      相关资源
      最近更新 更多