C++ 是否隐式转换为std::sort而不是std::map的比较函数对象(函子)?
我一直在使用C++ 是否隐式转换为std::sort而不是std::map的比较函数对象(函子)?,c++,C++,我一直在使用std::sort函数作为比较函数。函数隐式转换为函子(通过GCC)。我在声明std::map类型时尝试了相同的方法,但失败了 使用g++-Wall-Wextra-std=gnu++14-pedantic: #include <map> #include <algorithm> #include <vector> struct S { int i; }; struct Payload { bool b; }; bool compare(cons
std::sort
函数作为比较函数。函数隐式转换为函子(通过GCC)。我在声明std::map
类型时尝试了相同的方法,但失败了
使用g++-Wall-Wextra-std=gnu++14-pedantic
:
#include <map>
#include <algorithm>
#include <vector>
struct S { int i; };
struct Payload { bool b; };
bool compare(const S* const& lhs, const S* const& rhs)
{
return lhs->i < rhs->i;
}
using MyMap = std::map<const S*, Payload, compare>;
static void foo([[maybe_unused]] const MyMap&) {}
int main()
{
std::vector<const S*> vs;
std::sort(vs.begin(), vs.end(), compare); // OK
MyMap m;
foo(m);
}
#包括
#包括
#包括
结构S{int i;};
结构有效载荷{bool b;};
布尔比较(常量S*常量和左侧、常量S*常量和右侧)
{
返回lhs->ii;
}
使用MyMap=std::map;
静态void foo([[maybe_unused]]const MyMap&){
int main()
{
std::向量vs;
排序(vs.begin(),vs.end(),compare);//确定
MyMap m;
富(m),;
}
这是输出:
main.cpp:13:50: error: type/value mismatch at argument 3 in template parameter list for 'template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map'
13 | using MyMap = std::map<const S*, Payload, compare>;
| ^
main.cpp:13:50: note: expected a type, got 'compare'
main.cpp:13:50:错误:“模板类std::map”的模板参数列表中参数3的类型/值不匹配
13 |使用MyMap=std::map;
| ^
main.cpp:13:50:注意:应该是一个类型,得到“compare”
是否有一种方法可以将函子传递到
映射
声明,而无需手动定义函子类(使用std::sort
)即可?您似乎混淆了类型和值。std::sort
的第三个参数是值,std::map
的第三个参数是类型
using MyMap = std::map<const S*, Payload, bool (*)(const S* const&, const S* const&)>;
PS在排序示例中没有到函子的隐式转换。作为模板,可以使用任何合法的函数调用运算符调用函数排序。这包括函子和函数指针(除其他外)。您可以使用
decltype(&compare)
使其更具可读性。后来我发现了类似的问题。
MyMap my_map(compare);