2009-08-26 13 views
5

W przeszłości używałem funkcji bind1st i bind2nd w celu wykonywania prostych operacji na kontenerach STL. Mam teraz pojemnik klasy wskaźników MyBase które są przez wzgląd uproszczeń o następującej treści:Używanie STL do wiązania wielu argumentów funkcji

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

Chcę wywołać następującą funkcję statycznego za pomocą for_each i wiążące zarówno 1 i 2 parametrów jako takie:

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

Jak używać for_each i wiązać oba parametry tej funkcji?

Szukam czegoś wzdłuż linii:

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

widzę doładowania oferuje funkcję wiązania własnego, który wygląda jak coś, co byłoby obsługi tutaj, ale to, co jest rozwiązaniem STL?

Z góry dziękuję za odpowiedzi.

+0

Wystarczy być jasne dla każdego elementu w 'e' sekwencję, którą chcesz nazwać 'StaticFuncClass :: doSomething (e.getName(), funcReturningString())'? – jalf

+0

tak ... technicznie byłoby to e-> getName(), ponieważ elementy w kontenerze są wskaźnikami. –

Odpowiedz

13

Niezawodne awaryjna, gdy bind-składnia jest zbyt dziwne jest zdefiniowanie własnego funktor:

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

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

To jest mniej więcej to, co funkcjonuje bind zrobić za kulisami tak.

+0

+1 Tak, też o tym myślałem. Właśnie zastanawiałem się, czy był inline sposób to zrobić jak wiązanie tylko 1 z 2 przy użyciu bind1st lub bind2nd. –

+0

Nie trzeba jednak konstruktora. – xtofl

+1

Możliwe, że jest to możliwe dzięki funkcjom związanym z STL, ale robi się dla mnie trochę za bardzo włochaty. Wolę podejście funktora. Oczywiście w C++ 0x możesz zdefiniować go w linii z lambda – jalf

4

"Rozwiązaniem STL" byłoby napisanie własnego segregatora ... dlatego stworzyli potężne boost :: bind.

+2

powerfool? : p – jalf

+0

eh eh :) naprawiony! – UncleZeiv

3

można utworzyć lokalną strukturę funktora, które mogą być wstawiane przez kompilator (jak Jalf pokazał), lub skorzystać z prostej funkcji:

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

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

& nie powinny być konieczne. Funkcje mogą być niejawnie konwertowane na wskaźniki funkcji, więc tylko 'myFunc' będzie działało afaik. – jalf

+0

Masz rację. To nie jest konieczne. Zły nawyk, obawiam się. – xtofl

Powiązane problemy