在C ++中是否可以传递一个带有参数的函数作为参数?我不想只传递函数名称。我想传递包含参数的函数名称。请注意,我不知道函数接收了多少参数,也不知道类型。这就是我不将它们作为额外参数添加的原因。我只想要一个函数调用的引用,我可以按需执行。例如:
CallFunction(f(param1, param2));
但是f没有被评估,我只是得到函数调用的引用,我可以在需要时对它进行评估,例如:
CallFunction(f){
//do something and then in one moment do:
f; // and this calls f(param1, param2)
}
在C ++中可以实现的任何方式?提前谢谢。
答案 0 :(得分:3)
使用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));
}
答案 1 :(得分:0)
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的函数,但这可以很容易地修复。简单的解决方法是创建另一个CallFunction,它返回带有不同名称的void,或者使用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)...);
}
答案 2 :(得分:0)
您有几种选择。
一种是创建一个封装器闭包,它将封装对函数的调用。这样做的好处是,如有必要,您可以转换函数的输出。
使用简单的包装器与使用其他人之前提到的$check1 = isset($_POST['f_check1']);
$check2 = isset($_POST['f_check2']);
相同。
std::bind