代码之家  ›  专栏  ›  技术社区  ›  Shan

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

c++
  •  2
  • Shan  · 技术社区  · 6 年前

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

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

    我想做一些事情,在那里我可以创建成员类函数,然后将这些成员类函数发送到筛选函数 ,但只在函数中使用占位符 .

    例如,函数 fn 绑定中有一个占位符,但我要发送 FN 发挥作用 并具有功能 使用 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 回复  |  直到 6 年前
        1
  •  4
  •   Angew is no longer proud of SO    6 年前

    AS T.C. suggested in comments 解决方案其实很简单。 fn 已经是一个接受调用的 double ,所以就这样使用它:

    double res = b(fn);
    

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

    请注意,您的代码在的签名中有错误 b :你已经声明 f 用一个 void 返回类型,但您将其视为返回 双重的 . 签字 应该是

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

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