C++运行时向不可修改函数传递D个参数的实现方案
问题描述
补充说明
- 传入的函数为外部参数,无法对其进行修改。
核心问题
如何在以下场景中使用std::apply()?接收函数FUNC f和整数D作为参数,需要实现类似如下逻辑:
std::tuple<int, int, ..., int> tuple_with_D_ints; std::apply(f, tuple_with_D_ints);
另外,std::array<D, int>是否符合类元组(tuple-like)类型的定义?
需求场景
尝试实现一个函数,参数定义如下:
template <FUNC> compute_in_D_dims(int D, FUNC f, int N)
其中:
- D为维度数量
- f是外部提供的函数,接收D个参数
f(x₁, ..., x_D)并返回double类型值 - N是序列0到N-1的上限值
需要生成从序列0到N-1中选取D个元素的可重复置换,例如当D=3时,逻辑等价于:
for (int i = 0; i < N; ++i) for (int j = 0; j < N; ++j) for (int k = 0; k < N; ++k) f(i, j, k)
但D是运行时传入的参数,无法提前知晓,且D可能很大,手动编写多层嵌套循环并不现实。
想到这些置换可以与数字I建立双射关系,总共有N^D个置换,可通过遍历I生成所有置换。以D=3、N=2为例,置换如下:
0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 1 0 1
对应的双射函数:
bijection(n) = // 待实现函数
输入第5个索引(从0开始计数)时,返回:
bijection(5) = {1, 0, 1}
当前难点
如何将双射函数返回的元组/向量等类型的参数传递给外部函数f?参数数量可能是2个或10个,无法修改f的定义。曾听闻“可变参数函数”的相关提示,但完全不了解其具体概念及实现思路。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

