如果成员函数需要多个参数,则使用mem_fun_ref

时间:2013-06-21 13:45:13

标签: c++

不幸的是,我无法使用C ++ 11或Boost。

我有一些代码如下

struct Cell
{
    Cell(int value) : value(value) {}

    int value;

    bool CompareValue(const Cell& other) const
    {
        return this->value < other.value;
    }
};

int main()
{
    const int size = 10;
    vector<Cell> cells;
    for (int i = 0; i < size; i++)
    {
        cells.push_back(Cell(rand()));
        cout << "[ " << cells.back().value << " ] ";
    }
    cout << "\n\n";

    int maxvalue = max_element(cells.begin(), cells.end(), mem_fun_ref(&Cell::CompareValue))->value;
    int minvalue = min_element(cells.begin(), cells.end(), mem_fun_ref(&Cell::CompareValue))->value;

    cout << "Max = " << maxvalue << "\n" << "Min = " << minvalue << "\n";
}

但现在我需要扩展比较功能以采用比较模式

bool CompareValue(const Cell& other, MODE_T mode) const
{
    switch (mode)
    {
        ...
    }
}

但是,我无法弄清楚如何更新max_element的使用来使用这个新函数。每次比较运行的mode参数都是相同的。我尝试使用各种绑定和东西但无济于事。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

你可以写functor,这样就可以了。

struct CompareCellWithMode : public std::binary_function<Cell, Cell, bool>
{
public:
   result_type CompareCellWithMode
   (const first_argument_type& f, const second_argument_type& s)
   {
      return f.CompareValue(s, mode);
   }
private:
   MODE_T mode;
};

MODE_T mode;
int maxvalue = max_element(cells.begin(), 
cells.end(), CompareCellWithMode(mode))->value;

std::tr1::bind

MODE_T mode;
int maxvalue = max_element(cells.begin(), cells.end(), 
std::tr1::bind(&Cell::CompareValue, _1, mode))->value;