在另一个函数中使用std :: bind返回对象和占位符作为参数

时间:2019-01-10 11:10:29

标签: c++

我想将功能对象从std :: bind转发到另一个函数,但仅在最终调用的函数中使用占位符。

我有一个不能修改的外部类。它具有我想在另一个类的成员函数中使用的函数。此类中的所有函数都必须通过过滤器(函数b)。函数b具有用于所有成员函数的特殊双精度值,我不希望使用全局值。

我想做一些事情,可以创建成员类函数,然后将这些成员类函数发送到过滤器函数b,但仅在函数b中使用占位符。

例如,函数fn在绑定中有一个占位符,但是我想发送fn到函数b并让函数b使用n作为fn中占位符的值。

double ExtClass::a(int x, double y, double z)
{
     //do stuff
     return val;
}

double Class::b(std::function<void(double)> f)
{
    //do stuff
    double n = 7.88982;
    double res = f(n);
    return res;
}

double Class::c()
{
    //do some stuff...
    auto fn = std::bind(ExtClass::a, 2, 2.85, std::placeholders::_1);
    //I want to do something like this
    double res = b(fn(std::placeholders::_1));
    return res;
}

该代码无法编译,这似乎是由于函数c从技术上讲是使用占位符调用该函数而导致的,这是行不通的。我该如何解决?传递给绑定的其他参数在函数c中进行计算。

1 个答案:

答案 0 :(得分:4)

T.C. suggested in comments一样,解决方案实际上非常简单。 fn已经可以接受,并且可以接受一个double,因此就这样使用它即可:

double res = b(fn);

这为何起作用:创建绑定表达式以表达“稍后将提供此参数”的想法时,需要使用占位符。该绑定表达式的结果是可调用的,其参数由绑定表达式中使用的占位符确定。之后,它可以像其他任何可调用对象一样使用。

请注意,您的代码在b的签名中有错误:您已经使用返回类型f声明了void,但是您将其视为返回中的对象doubleb的签名应为

double Class::b(std::function<double(double)> f)

进行此更改后,代码即可工作。 [Live example]