如何将C ++函数指针作为参数传递一些固定值?

时间:2012-05-03 22:56:14

标签: c++ syntax arguments function-pointers

我想在特定情况下使用函数指针。我正在使用函数foo和以下原型

foo(double (*func)(double,double));

我可以正常方式致电foo

double bar(double x, double y) {
    //stuff
};

int main(void) {
    foo(bar);
    return 0; 
};

但我希望冻结x的值,以便获得与此类似double (*func)(double)的函数:

foo(bar(x,double))

C ++中是否存在与此类似的语法?

2 个答案:

答案 0 :(得分:2)

如果您不想使用std::bind / std::function,可以选择以下两种方式。

假设您的编译器支持将无状态lambda转换为函数指针,您可以使用lambda绑定x

void foo(double (*f)(double, double)) { (*f)(3.14159, 2.71828); }

double bar(double x, double y) { return x * y; };

int main()
{
    foo([](double x, double y) -> double { return bar(1.0, y); });
    return 0;
}

或者您甚至可以将foo更改为接受任意函数对象的模板。这样你就可以使用具有捕获功能的lambdas:

template<typename TFunc>
void foo(TFunc f) { f(3.14159, 2.71828); }

double bar(double x, double y) { return x * y; };

int main()
{
    double fixedprm = 1.0;
    foo([fixedprm](double x, double y) -> double { return bar(fixedprm, y); });
    return 0;
}

答案 1 :(得分:1)

如果你有C ++ 11,你可以使用std::bind。考虑这个例子,通过在一个快速移动中为每个元素添加5来转换向量:

#include <iostream>
using std::cout;

#include <functional>
using std::plus;
using std::bind;
using std::placeholders::_1;

#include <vector>
using std::vector;

#include <algorithm>
using std::transform;

int main()
{
    vector<int> v {1, 3, 6};

    //here we bind the value 5 to the first argument of std::plus<int>()
    transform (v.begin(), v.end(), v.begin(), bind (plus<int>(), _1, 5));

    for (int i : v)
        cout << i << ' '; //outputs "6 8 11"
}

至于你的例子,我能够写出这样的东西:

#include <iostream>
using std::cout;

#include <functional>
using std::bind;
using std::function;
using std::placeholders::_1;

void foo (function<double (double, double)> func) //take function object
{
    //try to multiply by 3, but will do 2 instead
    for (double i = 1.1; i < 5.6; i += 1.1)
        cout << func (i, 3) << ' '; 
}

double bar (double x, double y)
{
    return x * y;
}

int main()
{
    foo (bind (bar, _1, 2));
}

输出:

2.2 4.4 6.6 8.8 11

虽然我可能过于复杂。这实际上是我第一次同时使用std::bindstd::function