Честно говоря, C ++ в настоящее время довольно плох в подобных вещах. Он определенно может это сделать, как указано в ответе xtofl, но часто это очень неуклюже.
Boost имеет для каждого макроса , что очень удобно:
#include <boost/foreach.hpp>
#define foreach BOOST_FOREACH
// ...
foreach(Drug* d, drugSack)
{
sell(d);
}
Или, может быть, Boost.Bind , хотя это немного сложнее, но для вашего случая это выглядит очень хорошо:
#include <boost/bind.hpp>
// ...
// ThisClass refers to whatever class this method is in
std::for_each(drugSack.begin(), drugSack.end(),
boost::bind(&ThisClass::sell, this, _1));
Bind создаст функтор, который вызывает функцию-член ThisClass
, sell
для экземпляра класса, на который указывает this
, и заменит _1
аргументом, полученным из for_each
.
Самый общий метод - лямбда. У Boost есть лямбда-библиотека . Я не буду включать
здесь примеры, потому что для вашего конкретного случая boost bind работает, и лямбда-код был бы тем же самым кодом. Тем не менее, Ламба может сделать гораздо больше! Они в основном создают функции на месте (реализованные как функторы), но гораздо сложнее для изучения.
На мой взгляд, for-each и bind намного чище, чем "стандартные" методы C ++. На данный момент, я бы порекомендовал, по порядку: для каждого, связывание, стандартный C ++, лямбда-выражения.
В C ++ 0x, следующем стандарте C ++, все это снова будет хорошо со встроенной лямбда-поддержкой:
std::for_each(drugSack.begin(), drugSack.end(),
[this](DrugSack* d){ sell(d); });
Или новый диапазон для циклов:
for(DrugSack* d : drugSack)
{
sell(d);
}
Но мы должны подождать пару лет, прежде чем это станет возможным. :( Кроме того, я думаю, что цикл for, основанный на диапазоне, проще всего читать. Вот почему я рекомендую boost for-each, поскольку он имитирует это поведение и синтаксис (в основном).
Кроме того, совершенно не связано: стиль, в который вы включаете this->
, прежде чем все, по моему опыту, обычно считается плохой практикой. Компилятор сделает это за вас, все, что вы делаете - это загромождаете свой код и вносите вероятность ошибок. Вещи читаются намного лучше без него.