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