每次重复使用具有不同参数的函数

Repeatedly Running A Function With Different Parameters Each Time

本文关键字:参数 函数      更新时间:2023-10-16

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

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,我不关心可移植性。

C++没有任何

功能可以在结构的每个字段上运行函数。您需要为每个字段显式编写一个调用。

原因是,如果与最近的语言进行比较,C++是一种"低级语言"。它倾向于将源代码中编写的内容转换为指令。

我相信

有几种方法可以解决这项任务。

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

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);

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