2009-08-26 21 views
5

In passato ho utilizzato le funzioni bind1st e bind2nd per eseguire operazioni dirette su contenitori STL. Ora ho un contenitore di puntatori di classe myBase che sono per il bene semplicità il seguente:Utilizzo di STL per associare più argomenti di argomenti

 
class X 
{ 
public: 
    std::string getName() const; 
}; 

voglio chiamare la funzione statica seguente utilizzando for_each e vincolante sia per il 1 ° e 2 parametri come ad esempio:

StaticFuncClass :: doSomething (ptr-> getName(), funcReturningString());

Come utilizzerei for_each e associare entrambi i parametri di questa funzione?

Sto cercando qualcosa sulla falsariga di:

 
for_each(ctr.begin(), ctr.end(), 
     bind2Args(StaticFuncClass::doSomething(), 
        mem_fun(&X::getName), 
        funcReturningString()); 

vedo Boost offre una funzione bind proprio che assomiglia a qualcosa che sarebbe di utilizzo qui, ma qual è la soluzione STL?

Grazie in anticipo per le vostre risposte.

+0

Giusto per essere chiari, per ogni elemento 'e' in la sequenza, si desidera chiamare 'StaticFuncClass :: doSomething (e.getName(), funcReturningString())'? – jalf

+0

sì ... tecnicamente sarebbe e-> getName() perché gli elementi nel contenitore sono puntatori. –

risposta

13

Un fallback affidabile quando si legano sintassi diventa troppo strano è quello di definire il proprio funtore:

struct callDoSomething { 
    void operator()(const X* x){ 
    StaticFuncClass::doSomething(x->getName(), funcReturningString()); 
    } 
}; 

for_each(ctr.begin(), ctr.end(), callDoSomething()); 

Questo è più o meno ciò che i bind funzioni fanno dietro le quinte in ogni caso.

+0

+1 Sì, ci avevo pensato anch'io. Mi stavo chiedendo se ci fosse un modo in linea per farlo legando solo 1 dei 2 usando bind1st o bind2nd. –

+0

Non c'è bisogno di un costruttore, però. – xtofl

+1

Potrebbe essere possibile con le funzioni di collegamento STL, ma diventa un po 'troppo peloso per me. Preferirei l'approccio del functor. Ovviamente in C++ 0x potresti definirlo in linea con un lambda – jalf

4

La "soluzione STL" sarebbe scrivere il proprio raccoglitore ... è per questo che hanno creato il potente boost :: bind.

+2

powerfool? : p – jalf

+0

eh eh :) risolto! – UncleZeiv

3

È possibile creare una struttura functor locale, che può essere inline dal compilatore (come indicato JALF), o utilizzare una semplice funzione:

void myFunc(const X* x) { 
    StaticFuncClass::doSomething(x->getName(), funcrReturningString()); 
} 

for_each(c.begin(), c.end(), myFunc); 
+1

il & non dovrebbe essere necessario. Le funzioni possono essere convertite in modo implicito in puntatori di funzione, quindi solo "myFunc" funzionerebbe a dovere. – jalf

+0

Hai ragione. Non è necessario Cattiva abitudine, temo. – xtofl

Problemi correlati