相关疑难解决方法(0)

什么是C++仿函数及其用途?

我一直在听C++中的仿函数.有人可以给我一个关于它们是什么的概述以及在什么情况下它们会有用吗?

c++ functor function-object function-call-operator

822
推荐指数
8
解决办法
44万
查看次数

回调的优缺点(std :: function/std :: bind)与接口(抽象类)

我正在使用Boost.Asio在C++ 11中创建服务器应用程序.我创建了一个类,Server它负责接受新的连接.它基本上只是:

void Server::Accept() {
  socket_.reset(new boost::asio::ip::tcp::socket(*io_service_));
  acceptor_.async_accept(*socket_,
                         boost::bind(&Server::HandleAccept, this, boost::asio::placeholders::error));
}

void Server::HandleAccept(const boost::system::error_code& error) {
  if (!error) {
    // TODO
  } else {
    TRACE_ERROR("Server::HandleAccept: Error!");
  }
  Accept();
}
Run Code Online (Sandbox Code Playgroud)

我找到了两种方法(我确定还有更多)来"修复" TODO注释,即将套接字移动到应该去的地方.在我的情况下,我只想将它返回到拥有该Server实例的类实例(然后将其包装在一个Connection类中并将其插入到列表中).

  1. Server在其构造函数中有一个参数:std::function<void(socket)> OnAccept调用它HandleAccept.
  2. 我创建了一个抽象类,IServerHandler或者其他什么,它有一个虚方法OnAccept.Server需要IServerHandler在其构造函数的参数和类拥有实例的服务器实例扩展IServerHandler,构建Server*this作为参数.

选项1与选项2的优缺点是什么?还有更好的选择吗?我的Connection班级(OnConnectionClosed)中遇到了同样的问题.此外,根据我决定如何设计系统,它可能需要一个OnPacketReceivedOnPacketSent回调.

c++ interface callback boost-asio c++11

34
推荐指数
1
解决办法
6061
查看次数

我应该停止使用抽象基类/接口而是使用boost :: function/std :: function吗?

我刚刚了解了std :: function到底是什么以及它用于什么,我有一个问题:现在我们基本上有代理,我们应该在何时何地使用抽象基类,何时我们应该实现多态性通过std :: function对象提供给泛型类?ABC在C++ 11中受到了致命打击吗?

就个人而言,到目前为止,我的经验是切换委托代码比为特定行为创建多个继承类要简单得多......所以我有点困惑abotu从现在起如何有用的Abstract Bases.

c++ design-patterns stl c++11

12
推荐指数
1
解决办法
1527
查看次数

使用接口或函数对象进行回调?

在OO,一个通常与接口实现回调:(粗示例)

class Message {}

class IMsgProcessor {
public:
     virtual void handle_msg(const Message& msg) = 0;
}

class RequestMsgProcessor : public IMsgProcessor {
     virtual void handle_msg(const Message& msg)  {
     // process request message
    }
}

class CustomSocket {
public:
   Socket(IMsgProcessor* p) : processor_(p) {}

   void receive_message_from_network(const Message& msg) {
       // processor_ does implement handle_msg. Otherwise a compile time error. 
       // So we've got a safe design.
       processor_->handle_msg(msg);
   }
private:
   IMsgProcessor* processor_;
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.使用C++ 11,另一种方法是让CustomSocket只接收std :: function对象的实例.它并不关心它的实现位置,或者即使对象是非null值:

class CustomSocket {
public:
   Socket(std::function<void(const …
Run Code Online (Sandbox Code Playgroud)

c++ design-patterns interface c++11

9
推荐指数
1
解决办法
2755
查看次数