每次重复运行不同参数的函数

时间:2013-11-15 21:24:59

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

目前,我有一个用于创建大量参数的结构,然后我必须在所有参数上运行各种函数。

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

2 个答案:

答案 0 :(得分:0)

C ++没有任何功能可以在结构的每个字段上运行函数。您需要明确地为每个字段编写一个调用。

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

答案 1 :(得分:0)

我相信有几种方法可以解决这个问题。

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

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

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