如何使用std :: bind与std :: function和std :: map

时间:2016-08-26 13:03:09

标签: c++11 function-pointers

我正在尝试创建一个std :: function的映射,然后尝试将它绑定几个参数,但它给出了一个错误。 所以,我的std :: function定义是

using abc = std::function<double(const double& t1, const double& t2)>;

,地图是

std::map<std::pair<std::string, std::string>, abc> conversion_;

我尝试在此地图中插入的方式是

conversion_.emplace(
            std::make_pair("a", "b"),
            std::bind(conversion, 3, std::placeholders::_1));

conversion_.find(std::make_pair("a", "b"))->second(4); -- Access

我已经定义了函数转换,但是当我尝试访问该函数时,它给出了以下错误

 error: no match for call to ‘(const std::function<double(const double&, const double&)>) (int)’

添加完整代码: 转换函数在单独的文件中定义:

namespace x
{
    double conversion(const double& a, const double& b);
}

我正在尝试定义地图的头文件

namespace x
{
    class main 
    {
    public:
        using abc = std::function<double(const double& t1, const double& t2)>;
        main();
    private:
        std::map<std::pair<std::string, std::string>, abc> conversion_;
    };
}

CPP文件

namespace x
{
main::main() 
{
    conversion_.emplace(
        std::make_pair("a", "b"),
        std::bind(conversion, 3, std::placeholders::_1));
    auto m = conversion_.find(std::make_pair("a", "b"))->second(4);
}
}   

1 个答案:

答案 0 :(得分:3)

我猜conversion的功能为double(const double& t1, const double& t2)。如果是,std::bind(conversion, 3, std::placeholders::_1)定义一个仿函数,该仿函数需要一个参数doubleconversion的另一个参数固定为3)并返回double。您只需将abc修改为std::function<double(const double& t1)>;

即可