这个定义在OuterClass里面:

struct Compare
{
    bool operator ()(const T&, const T&);
};
typedef set<T, Compare> MySet;

我的问题是比较函数operator ()取决于OuterClass的状态。 (MySet实例在优化算法中使用,它们在不同阶段必须进行不同的排序。)

有什么方法/解决方案可以从比较函数OuterClass中访问operator ()的非静态成员吗​​?

最佳答案



有。只需为Compare编写一个用户定义的构造函数,即可接受并存储对OuterClass的引用,方法是:

struct Compare
{
    Compare(OuterClass& o) : oc(o) { }
    bool operator ()(const T&, const T&)
    {
        // Uses oc somehow...
    }
private:
    OuterClass& oc;
};

然后,在创建集合时,您可以执行以下操作:
int main()
{
    typedef std::set<T, Compare> MySet;

    OuterClass oc; // <== Construct an object of type Outerclass somehow...

    MySet ms(Compare(oc)); // <== Construct your comparator and pass it
                           //     in input to the constructor of std::set
}

但是要当心:订购标准应保持稳定。对于同一集合,元素必须始终比较相同。根据C++ 11标准的23.2.4/3段:

关于C++ STL设置: Compare object with extrinsic state,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16261441/

10-11 03:57
查看更多