我一直在听C++中的仿函数.有人可以给我一个关于它们是什么的概述以及在什么情况下它们会有用吗?
我正在使用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类中并将其插入到列表中).
Server在其构造函数中有一个参数:std::function<void(socket)> OnAccept调用它HandleAccept.IServerHandler或者其他什么,它有一个虚方法OnAccept.Server需要IServerHandler在其构造函数的参数和类拥有实例的服务器实例扩展IServerHandler,构建Server以*this作为参数.选项1与选项2的优缺点是什么?还有更好的选择吗?我的Connection班级(OnConnectionClosed)中遇到了同样的问题.此外,根据我决定如何设计系统,它可能需要一个OnPacketReceived和OnPacketSent回调.
我刚刚了解了std :: function到底是什么以及它用于什么,我有一个问题:现在我们基本上有代理,我们应该在何时何地使用抽象基类,何时我们应该实现多态性通过std :: function对象提供给泛型类?ABC在C++ 11中受到了致命打击吗?
就个人而言,到目前为止,我的经验是切换委托代码比为特定行为创建多个继承类要简单得多......所以我有点困惑abotu从现在起如何有用的Abstract Bases.
在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)