函数中的c ++ struct声明

时间:2014-02-01 22:25:22

标签: c++ struct std comparator stl-algorithm

这可能是一个愚蠢的问题,但我写了如下代码。

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)'

我如何在函数内部使用结构作为比较器? 或者,这不可能吗?

2 个答案:

答案 0 :(得分:0)

这是使用包装器的一个很好的例子。即使我们要实施从sort_predstd::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 ++规范的早期版本不允许这样做。