0

从这里: 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 中做到这一点?

4

3 回答 3

2
for (auto &p : participants_)
    if (p != participant)
    {
        //do your stuff
    }
于 2013-05-28T19:07:45.733 回答
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. 真的是这样吗?

于 2013-05-28T19:07:58.740 回答
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 
    }
}
于 2013-05-28T19:11:14.333 回答