gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:51:47 24 4
gpt4 key购买 nike

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

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

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

例如,函数fn在绑定(bind)中有一个占位符,但我想发送 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从技术上讲,用占位符调用函数,这是行不通的。我该如何解决这个问题?传递给绑定(bind)的附加参数在函数中计算 c .

最佳答案

作为T.C. suggested in comments ,解决方法其实很简单。 fn 已经是一个接受一个 double 的可调用函数,所以只需这样使用它:

double res = b(fn);

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

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

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

有了这个改变,代码就可以工作了。 [Live example]

关于c++ - 使用 std::bind 返回对象和占位符作为另一个函数中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54127417/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com