【发布时间】:2019-02-24 10:41:06
【问题描述】:
在我的 C++ 程序中,我经常需要在某个小的有限域上根据其参数的所有可能值构建函数的值向量。例如,像这样:
int q = 7;
vector<int> GFq;
for (int x = 0; x < q; x++) GFq.push_back(x);
auto P = [q](int x, int y) -> int { return (x*x+y) % q; };
auto Q = [q](int x, int y) -> int { return (x+2*y) % q; };
auto f = [q,P,Q](int x1, int y1, int x2, int y2)
-> int {return (P(x1,y1) + Q(x2,y2)) % q; }
vector<int> table;
for (int x1: GFq) for (int y1: GFq) for (int x2: GFq) for (int y2: GFq)
table.push_back(f(x1,y1,x2,y2));
这种模式在我的代码中经常重复,我很自然地想把它变成一个函数。所以我需要这样的东西:
template<typename F> // not sure if I need to use templates
vector<int> tabulate(int q, F f) {
// run through values 0..q-1 for all arguments of f
// and store the values of f to the resulting vector
}
一些问题/问题:
- 我希望能够将任意函数传递给
tabulate(),包括不同数量的函数(即f(x)、f(x,y)等) - 我想构造我“即时”传递的函数,包括其他函数的使用(与
f相同的方式是在第一个代码sn-p 中由P和Q构造的) - 如果我设法传递这样一个函数,我如何在
tabulate()内对f的所有可能参数(即0..q-1的每个参数)运行循环?
【问题讨论】:
-
是的,但我也希望能够使用
f的两个、三个等参数调用制表 -
这就是为什么你在给定的示例代码中有第一个模板重载
tabulate( const Function f, Args&&... args),你传递f并转发所有应该使用f作为第二个模板参数调用的参数。 -
嗯,但是当我尝试调用
std::vector<int> table = tabulate( GFq.begin(), GFq.end(), [q, P](int x1, int y1, int x2) { return (P(x1, y1) + x2) % q; } );时,它给了我一个编译错误 -
@Jarod42 好吧,是的,但主要问题不是迭代而是传递任意数量的函数
标签: c++ lambda variadic-functions