将运算符=传递给函数对象

时间:2019-06-12 13:56:34

标签: c++ operator-overloading bind

我尝试将一个操作符()与一个函数对象进行绑定。然后,我想将此函数对象用作我声明的映射中的自定义比较器。但是我收到以下编译错误

  

错误C3867:'Comparator :: operator()':非标准语法;采用 '&'   创建一个指向成员的指针   1>   错误C2672:'std :: bind':找不到匹配的重载函数

     

错误C2923:“ std :: map”:“ predict”不是有效的模板类型   参数“ _Pr”的参数

我不想使用lamda表达式

我编写的代码如下

#include "pch.h"
#include <algorithm>
#include <functional>
#include <iostream>
#include <map>
struct Comparator : std::binary_function<int const &, int const &, bool>
{
    template<typename T>
    bool operator()(T const & a, T const & b)
    {
        return a < b;
    }
};
int main()
{

    std::cout << "Hello World!\n"; 
    std::function<bool(Comparator&,int const &, int const &)> predict = 
    std::bind(Comparator::operator(), std::placeholders::_1, 
     std::placeholders::_2);
    std::map<int, int, predict> x;

}

2 个答案:

答案 0 :(得分:2)

绑定后,您将获得使用2个参数(int,int)的函子,函数std::function<bool(Comparator&,int const &, int const &)>的签名是错误的-Comparator是多余的,请尝试以下操作:

    std::function<bool(int const &, int const &)> predict = 
       std::bind( Comparator(), std::placeholders::_1, std::placeholders::_2);

     std::map<int, int, decltype(predict)> x{predict};

答案 1 :(得分:2)

您无需在此处使用=QUERY(VBOM!R5:GJ2811,"SELECT BY",1) 或lambda。 std::bind是完全有效的比较器,因此您只需将Comparator声明为:

x

如果实际的std::map<int, int, Comparator> x; 具有需要初始化的某种状态,则可以将Comparator对象传递给Comparator的构造函数:

std::map