【发布时间】:2021-10-29 16:11:59
【问题描述】:
我想知道是否可以使用可变参数函数/模板来将可变数量的参数(它们本身是函数的返回值)传递给可变参数函数。
约束:
- 没有 STL/Boost/其他库。
- 没有循环/递归。
- 符合 C++17 或更早版本(不超过 C++17)。
简单示例:
using fn = F(...);
fn* func = (fn*) addr;
value = (*func)(pop_t(outputstack,o_stackidx,o_stacksize)...);
push_t(outputstack,o_stackidx,o_stacksize, value);
fn* 是一个函数指针(从一个已知的用户定义的函数内存地址转换而来),它接收可变数量的 pop_t 参数(从堆栈中弹出的值),这些值 (outputstack,o_stackidx,o_stacksize)是静态的,本身不需要可变参数。本质上,我想知道是否有可能让 pop_t 函数重复可变次数 A.) 通过取决于适当数量的参数 fn 能够接收或 B.) 使用用户定义的整数指定重复次数。
例如,假设用户要输入一个 sin 或 atan2 函数,这两个函数采用不同数量的参数,分别是 sin(x) 和 atan(y,x)。对于这两个各自的函数,函数调用表达式如下所示:
sin -> (*func)(pop_t(outputstack,o_stackidx,o_stacksize));
atan2 -> (*func)(pop_t(outputstack,o_stackidx,o_stacksize),pop_t(outputstack,o_stackidx,o_stacksize));
具有 N 个参数的函数通过调用 pop_t N 次从堆栈中弹出 N 个值。
可重现的例子:
template<class U, class I>
U pop_t(U* stack, I &stackidx, I &stacksize) {
if(stacksize>0) {
stacksize--;
stackidx = stackidx--;
return stack[stackidx];
}
else {
return stack[stackidx];
}
}
int main() {
float outputstack[2] = {3.141/2,1};
int o_stackidx = 2;
int o_stacksize = 2;
long addr = (long)&atan2;
using fn = float(...);
fn* func = (fn*) addr;
// Unknown variadic function pointer
float value = (*func)(pop_t(outputstack,o_stackidx,o_stacksize,nt)...);
return 0;
}
【问题讨论】:
-
您的描述对我来说有点不清楚。您能否在呼叫站点添加您希望能够编写的代码?即,如果它可用,你能准确地展示你将如何使用这样的功能吗?
-
@cigien 赋值将是该函数的调用点。例如,用户输入一个 sin 或 atan2 函数,这两个函数分别采用不同数量的参数,即 sin (x) 和 atan(y,x)。对于这两个各自的函数,函数调用表达式如下所示: sin -> (*func)(pop_t(outputstack,o_stackidx,o_stacksize)); atan2 -> (*func)(pop_t(outputstack,o_stackidx,o_stacksize),pop_t(outputstack,o_stackidx,o_stacksize));具有 N 个参数的函数通过调用 pop_t N 次从堆栈中弹出 N 个值。希望这会有所帮助:)
-
请将所有相关信息添加到问题本身,而不是作为评论。此外,您的描述仍然不清楚,例如
pop_t是什么?试着做一个minimal reproducible example,当然不能写的函数除外。 -
@cigien 刚刚添加了这些 :) 谢谢!
标签: c++ c++11 function-pointers variadic-templates variadic-functions