繁体   English   中英

使用C ++中的参数传递函数

[英]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));
}
  1. 接受任何可调用函数作为第一个参数
  2. 使用可变参数模板并接受任意类型的任意数量的参数。
  3. 使用完美转发。

http://ideone.com/z2kLUx

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

http://ideone.com/El3WUi

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM