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

Pass a operator = to a function object

我尝试将绑定运算符 () 与函数对象一起传递。然后我想将此函数对象用作我声明的映射中的自定义比较器。但是我得到以下编译错误

error C3867: 'Comparator::operator ()': non-standard syntax; use '&' to create a pointer to member 1> error C2672: 'std::bind': no matching overloaded function found

error C2923: 'std::map': 'predict' is not a valid template type argument for parameter '_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 个参数 (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};

您不需要在此处使用 std::bind 或 lambda。 Comparator 是一个完全有效的比较器,因此您可以将 x 声明为:

std::map<int, int, Comparator> x;

如果您的实际 Comparator 有一些需要初始化的状态,您可以将 Comparator 对象传递给 std::map 的构造函数:

Comparator cmp{some, constructor, args};
std::map<int, int, Comparator> x{cmp};