Использование STL для привязки нескольких аргументов функции - PullRequest
5 голосов
/ 26 августа 2009

В прошлом я использовал функции bind1st и bind2nd для выполнения прямых операций над контейнерами STL. Теперь у меня есть контейнер указателей класса MyBase, которые для простоты ради:

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

Я хочу вызвать следующую статическую функцию, используя for_each и связав оба-го и 1-го параметра как таковые:

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

Как бы я использовал for_each и связывал оба параметра этой функции?

Я ищу что-то вроде:

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

Я вижу, что Boost предлагает собственную функцию привязки, которая выглядит здесь как нечто полезное, но каково решение STL?

Заранее спасибо за ваши ответы.

Ответы [ 3 ]

13 голосов
/ 26 августа 2009

Надежный запасной вариант, когда синтаксис привязки становится слишком странным, - это определение собственного функтора:

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

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

Это более или менее то, что функции bind в любом случае делают за сценой.

4 голосов
/ 26 августа 2009

«STL-решение» - написать свой собственный механизм связывания ... вот почему они создали мощный boost :: bind.

3 голосов
/ 26 августа 2009

Вы можете создать локальную структуру функторов, которая может быть встроена компилятором (как показал Джальф), или использовать простую функцию:

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

for_each( c.begin(), c.end(), myFunc );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...