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

时间:2016-03-31 15:55:18

标签: c++ function parameters

在C ++中是否可以传递一个带有参数的函数作为参数?我不想只传递函数名称。我想传递包含参数的函数名称。请注意,我不知道函数接收了多少参数,也不知道类型。这就是我不将它们作为额外参数添加的原因。我只想要一个函数调用的引用,我可以按需执行。例如:

CallFunction(f(param1, param2));

但是f没有被评估,我只是得到函数调用的引用,我可以在需要时对它进行评估,例如:

CallFunction(f){
 //do something and then in one moment do:
 f; // and this calls f(param1, param2)
}

在C ++中可以实现的任何方式?提前谢谢。

3 个答案:

答案 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)

  1. 接受任何可调用函数作为第一个参数
  2. 使用可变参数模板并接受任意类型的任意数量的参数。
  3. 使用完美转发。
  4. 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的函数,但这可以很容易地修复。简单的解决方法是创建另一个CallFunction,它返回带有不同名称的void,或者使用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)...);
    }
    

答案 2 :(得分:0)

您有几种选择。

一种是创建一个封装器闭包,它将封装对函数的调用。这样做的好处是,如有必要,您可以转换函数的输出。

使用简单的包装器与使用其他人之前提到的$check1 = isset($_POST['f_check1']); $check2 = isset($_POST['f_check2']); 相同。

std::bind