отсюда :
http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/example/chat/chat_server.cpp
std::set<chat_participant_ptr> participants_;
....
participants_.insert(participant);
....
void deliver(const chat_message& msg, chat_participant_ptr participant)
{
recent_msgs_.push_back(msg);
while (recent_msgs_.size() > max_recent_msgs)
recent_msgs_.pop_front();
// I want to call the deliver method on all members of set except the participant passed to this function, how to do this?
std::for_each(participants_.begin(), participants_.end(),
boost::bind(&chat_participant::deliver, _1, boost::ref(msg)));
}
Я хочу вызвать метод доставки для всех членов набора, кроме участника, переданного этой функции, как это сделать в vs2008?
Простой цикл for с использованием итератора должен помочь.
std::set<chat_participant_ptr>::iterator iter;
for(iter = participants_.begin();iter != participants_.end();++iter)
{
if(participant != iter)
{
call deliver function on *iter
}
}
for (auto &p : participants_)
if (p != participant)
{
//do your stuff
}
На самом деле, самая ясная вещь может быть просто написать for
цикл напрямую:
for (auto &p : participants_) {
if (p != participant)
p->deliver();
}
или эквивалент C ++ 03:
for (std::set<chat_participant_ptr>::iterator i = participants_.begin();
i != participants_.end(); ++i)
{
if ((*i) != participant)
(*i)->deliver();
}
Я не думаю, используя for_each
здесь вы приобретаете какую-либо общность или выразительность, в основном потому, что вы не пишете ничего, что вы хотели бы использовать повторно.
если ты делать Если вы хотите регулярно делать что-то подобное, вы можете написать for_each_not_of
, Это действительно так?