2010-03-19 11 views
2

J'ai besoin d'un pointeur de fonction qui prend deux arguments et retourne une chaîne.Quel est le moyen de créer un foncteur qui lie un argument

Je voudrais passer un adaptateur qui enveloppe une fonction qui prend un argument et renvoie la chaîne (c'est-à-dire rejette l'un des arguments).

Je peux trivialement construire mon propre adaptateur, qui prend les 2 arguments, appelle la fonction enveloppée en passant un seul argument à travers.

Mais je préfèrerais avoir un moyen simple de créer un adaptateur à la volée, s'il y a un moyen facile de le faire en C++/boost?

Voici quelques détails pour en faire un peu plus concret:

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; 
} 

De toute évidence, je peux fournir un membre qui s'adapte GetRowText à prendre deux arguments et ne laisse passer que le premier à GetRowText() lui-même.

Mais y a-t-il déjà un relieur/un adaptateur qui me permet de faire cela?

Répondre

4

En ne fournissant _1, il ignorera le 2ème paramètre donné à m_callback et appeler MyCtrl::GetRowText avec un paramètre int.

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

D'autre part,

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

est également valable, où nous envoyons le 2ème paramètre passé à m_callback dans le 1er paramètre de MyCtrl::GetRowText.

+0

VS2008 SP 1 se plaint de ce code. Je suppose que boost :: bind crée un foncteur qui prend 1 argument (au moins dans votre premier exemple, qui est celui dont j'ai besoin). S'il y a un moyen de forcer la liaison à générer une fonction-signature qui correspond à TooltipTextFn tout en utilisant seulement le seul argument ... – Mordachai

+0

Je ne semble pas courir dans ceci. Je travaille sous g ++ et je n'ai pas accès à VS. À titre de suggestion alternative, s'agit-il du pointeur 'this' dans les paramètres par défaut du constructeur? – tJener

+0

Vous avez raison. Le problème que je rencontrais était qu'un conditionnel ternaire ne compilait pas X? Y: Z. Mais si j'ai explicitement fait un X = Y; alors les choses allaient bien. Merci. :) – Mordachai