[英]Pass a function with the arguments in C++
在C ++中是否可以传递函数WITH它的参数作为参数? 我不想只传递函数名称。 我想传递包含参数的函数名称。 请注意,我不知道函数接收了多少参数,也不知道类型。 这就是我不将它们作为额外参数添加的原因。 我只想要一个函数调用的引用,我可以按需执行。 例如:
CallFunction(f(param1, param2));
但是f没有被评估,我只是得到函数调用的引用,我可以在需要时对其进行评估,例如:
CallFunction(f){
//do something and then in one moment do:
f; // and this calls f(param1, param2)
}
在C ++中可以实现的任何方式? 先感谢您。
使用std::bind
完整示例:
#include <iostream>
#include <functional>
void f(int p1, int p2) {
std::cout << "In f(" << p1 << "," << p2 << ")\n";
}
template <typename F>
void CallFunction(F f)
{
std::cout << "Start CallFunction\n";
f();
std::cout << "End CallFunction\n";
}
int main()
{
CallFunction(std::bind(f, 2, 3));
}
int HelloWorld(string var1, const char* var2)
{
cout << var1 << " " << var2 << endl;
return 5;
}
template<typename Fn, typename... Args>
auto CallFunction(Fn fn, Args&&... args)
{
return fn(forward<Args>(args)...);
}
int main()
{
cout << "Value returned: " << CallFunction(HelloWorld,"Hello","World");
return 0;
}
这是一个简单的版本,它有一个缺点:你必须指定一个返回非void的函数,但这可以很容易地修复。 简单的解决方法是创建另一个使用不同名称返回void的CallFunction,或者使用std::enable_if
。
template<typename Fn, typename... Args>
auto CallFunction(Fn fn, Args&&... args) -> typename enable_if<is_same<void, decay_t<decltype(fn(forward<Args>(args)...))>>::value, decltype(fn(forward<Args>(args)...))>::type
{
fn(forward<Args>(args)...);
}
template<typename Fn, typename... Args>
auto CallFunction(Fn fn, Args&&... args) -> typename enable_if<!is_same<void, decay_t<decltype(fn(forward<Args>(args)...))>>::value, decltype(fn(forward<Args>(args)...))>::type
{
return fn(forward<Args>(args)...);
}
你有几个选择。
一种是创建一个封装器闭包,它将封装对函数的调用。 这样做的好处是,您可以根据需要转换函数的输出。
做一个简单的包装器就像使用其他人之前提到的std::bind
一样。
#include <functional>
#include <iostream>
void CallFunction(std::function<void(void)> f) {
f();
}
int main() {
auto closure = [](int a, int b) {
std::cout << a << ", " << b << std::endl;
};
auto wrapper = [closure]() {
closure(1, 2);
};
CallFunction(wrapper);
CallFunction(std::bind(closure, 3, 4));
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.