2010-03-19 23 views
2

我需要一個函數指針,它需要兩個參數並返回一個字符串。什麼是創建一個仿函數的推動方式

我想通過一個適配器來包裝一個函數,該函數接受一個參數並返回字符串(即放棄其中一個參數)。

我可以簡單地構建我自己的適配器,它接受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()本身。

但是,是否已有一個提升粘結劑/適配器,讓我這樣做?

回答

4

僅通過提供_1,它將忽略給予m_callback的第二個參數,並通過一個int參數調用MyCtrl::GetRowText

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

在另一方面,

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

也是有效的,在這裏我們發送傳遞給m_callbackMyCtrl::GetRowText第一參數的第二個參數。

+0

VS2008 SP 1抱怨此代碼。我懷疑boost :: bind正在創建一個帶有1個參數的函子(至少在你的第一個例子中,這是我需要的)。如果有辦法強制綁定生成匹配TooltipTextFn的函數簽名,而只使用一個參數... – Mordachai 2010-03-19 22:04:39

+0

我似乎沒有遇到這個問題。我正在g ++下工作,沒有現成的VS訪問權限。 作爲一種替代的建議,它是構造函數默認參數中的this指針嗎? – tJener 2010-03-19 22:16:18

+0

你說得對。我遇到的問題是三元條件不會編譯X? Y:Z.但是如果我明確地做了X = Y,那麼事情就很好。謝謝。 :) – Mordachai 2010-03-22 13:48:02

相關問題