这可能是一个愚蠢的问题,但我写了如下代码。
void someFunction() {
struct sort_pred {
inline bool operator()(const std::pair<int,double> &left, const std::pair<int,double> &right) const {
return left.second < right.second;
}
};
std::sort(regionAreas.begin(), regionAreas.end(), sort_pred());
}
然而,这并没有编译说,
///:1542: error: no matching function for call to 'sort(std::vector<std::pair<int, double> >::iterator, std::vector<std::pair<int, double> >::iterator, someFunction::sort_pred)'
我如何在函数内部使用结构作为比较器? 或者,这不可能吗?
答案 0 :(得分:0)
这是使用包装器的一个很好的例子。即使我们要实施从sort_pred
到std::pair<int, double>
的转化,也不会有效,因为std::pair<int, double>
没有operator()
。因此,存储包装而不是std::pair<int, double>
将会很好。
class sort_pred;
class wrapper
{
public:
//some conversion-stuff from std::pair<int, double> to wrapper
//not really needed in this example
wrapper(const std::pair<int, double>& p) : _p(p) {}
//needed in operator wrapper() in sort_pred
wrapper(const sort_pred *s) : _p()
{
//////
//maybe you want access to private-members of
//sort_pred in here, so just add friend class sort_pred
//to the class, if this is the case.
//////
//Just let the magic happen
//////
}
//for std::sort
bool operator()(const wrapper &left, const wrapper &right)
{
return left._p.second < right._p.second;
}
private:
std::pair<int, double> _p;
};
struct sort_pred {
sort_pred(){}
//This allows us to static_cast sort_pred to wrapper
operator wrapper()
{
return wrapper(this);
}
};
bar foo()
{
std::vector<wrapper> regionAreas;
//some stuff with regionAreas.push_back :D
std::sort(regionAreas.begin(), regionAreas.end(), static_cast<wrapper>(sort_pred()));
return bar_value;
}
答案 1 :(得分:0)
您的问题似乎与Using local classes with STL algorithms重复。
简而言之,C ++ 11允许这样做,但C ++规范的早期版本不允许这样做。