每次重复使用具有不同参数的函数
Repeatedly Running A Function With Different Parameters Each Time
目前,我有一个结构,我用它来创建很多参数,然后我必须在所有这些参数上运行各种函数。
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);
不,你不能只传递结构的名称,假设编译器会用它的成员替换它。您必须明确输入它们;实际上,您不希望使用每个结构成员,隐式结构成员是排除的良好候选者。
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类