gpt4 book ai didi

c++ - 我怎样才能实现一个函数来调用任何(任意)函数及其(任意)参数?

转载 作者:行者123 更新时间:2023-11-30 02:44:35 26 4
gpt4 key购买 nike

我想要以下内容:

void foo( 
/* something representing a function f */,
/* arguments a1, a2, etc. in some form */ )
{
/* magic - invoke f(a1, a2, etc.)*/
}

/* ... */

void bar(float f, char* s);
void baz(int i);
/* etc. */

int main() {
/* ... */
foo(bar, SomeKindOfTransformationOrNoneAtAll(f, s));
foo(baz, SomeKindOfTransformationOrNoneAtAll(i));
/* etc. */
}

我可以实现foo()吗?也就是说,我可以编写一个函数,它接受任意其他函数和一堆参数(可变参数、 vector 、列表,或者你有什么)并使用传递的参数调用传递的函数吗?

如果可能的话,是否有一个图书馆可以帮助它?或者它的一些常见习语?

注意:

  • 我不想将参数绑定(bind)到函数 foo() 之外,而是绑定(bind)到函数内部。因此,foo() 必须接受的不仅仅是一个函数*/std::function/etc。参数。

最佳答案

可变参数模板确实可以做到这一点。

template<typename T, typename... Args> void foo(T func, Args&&... args) {
func(std::forward<Args>(args)...);
}

然后简单地将参数直接传递给foo。这称为完美转发。然而,对于 lambda,将它们绑定(bind)在那里确实更符合习惯。

template<typename T> void foo(T func) {
func();
}
int main() {
foo([] { baz(param1, param2); });
}

如果参数不是常量,您可以捕获它们。这是一个更好的选择,因为您可以根据需要轻松地将模板转换为非模板,并且避免了参数生命周期与否的问题,因为 lambda 用户可以根据需要进行捕获。您可以通过这种方式获取多个对象而不是一个,因为可变参数包只能出现一次。最后,在使用命名函数时,您不必费心让它选择单个函数指针。

关于c++ - 我怎样才能实现一个函数来调用任何(任意)函数及其(任意)参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25157417/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com