目前,我有一个用于创建大量参数的结构,然后我必须在所有参数上运行各种函数。
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,我不关心可移植性。
答案 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);
不,你不能只传递结构的名称,假设编译器会用它的成员替换它。你必须明确地输入它们;实际上,您不希望使用每个结构成员,隐式结构成员是排除的好选择。