我想将功能对象从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
中进行计算。
答案 0 :(得分:4)
与T.C. suggested in comments一样,解决方案实际上非常简单。 fn
已经可以接受,并且可以接受一个double
,因此就这样使用它即可:
double res = b(fn);
这为何起作用:创建绑定表达式以表达“稍后将提供此参数”的想法时,需要使用占位符。该绑定表达式的结果是可调用的,其参数由绑定表达式中使用的占位符确定。之后,它可以像其他任何可调用对象一样使用。
请注意,您的代码在b
的签名中有错误:您已经使用返回类型f
声明了void
,但是您将其视为返回中的对象double
。 b
的签名应为
double Class::b(std::function<double(double)> f)
进行此更改后,代码即可工作。 [Live example]