从这里: 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)));
}
我想在set的所有成员上调用deliver方法,除了传递给此函数的参与者,如何在vs2008中执行此操作?
答案 0 :(得分:2)
for (auto &p : participants_)
if (p != participant)
{
//do your stuff
}
答案 1 :(得分:2)
真的,最明显的可能就是直接写一个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
。那是真的吗?
答案 2 :(得分:1)
使用迭代器的简单for循环应该可以解决问题。
std::set<chat_participant_ptr>::iterator iter;
for(iter = participants_.begin();iter != participants_.end();++iter)
{
if(participant != iter)
{
call deliver function on *iter
}
}