Какой способ ускорить создание функтора, который связывает аргумент - PullRequest
2 голосов
/ 19 марта 2010

Мне нужен указатель на функцию, который принимает два аргумента и возвращает строку.

Я хотел бы передать адаптер, который оборачивает функцию, которая принимает один аргумент и возвращает строку (то есть отбрасывает один из аргументов).

Я могу тривиально построить свой собственный адаптер, который принимает 2 аргумента, вызывает упакованную функцию, пропуская только один аргумент.

Но я бы предпочел простой способ создания адаптера на лету, если есть простой способ сделать это в C ++ / boost?

Вот некоторые подробности, чтобы сделать это немного более конкретным:

typedef boost::function<CString (int,int)> TooltipTextFn;

class MyCtrl
{
public:
    MyCtrl(TooltipTextFn callback = boost::bind(&MyCtrl::GetCellText, this, _1, _2)) : m_callback(callback) { }

    // QUESTION: how to trivially wrapper GetRowText to conform to TooltipTextFn by just discarding _2 ?!
    void UseRowText() { m_callback = boost::bind(&MyCtrl::GetRowText, this, _1, ??); }

private:

    CString GetCellText(int row, int column);
    CString GetRowText(int row);

    TooltipTextFn   m_callback;
}

Очевидно, я могу предоставить член, который адаптирует GetRowText для получения двух аргументов и передает только первый в сам GetRowText ().

Но есть ли уже скоросшиватель / адаптер, который позволяет мне это делать?

1 Ответ

4 голосов
/ 19 марта 2010

Только предоставив _1, он проигнорирует второй параметр, заданный для m_callback, и вызовет MyCtrl::GetRowText с одним параметром int.

void UseRowText() { m_callback = boost::bind(&MyCtrl::GetRowText, this, _1); }

С другой стороны,

void UseRowText() { m_callback = boost::bind(&MyCtrl::GetRowText, this, _2); }

также допустимо, когда мы передаем 2-й параметр, переданный m_callback, в 1-й параметр MyCtrl::GetRowText.

...