2010-03-19 63 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

相关问题