从模板类或多个构造函数继承?

时间:2018-01-30 13:37:42

标签: c++ templates inheritance boost

考虑使用以下模板类来处理不同的 boost :: asio 套接字(即TCP / UDP / Serial):

template<class T>
class Connection:: private boost::noncopyable, public  std::enable_shared_from_this<Connection<T>> {

            Connection(const std::shared_ptr<IoServiceWrapper> &ioService, 
                       const std::shared_ptr<boost::asio::io_context::strand> &ioStrand);

  ..
}    

其中每个 boost 套接字对象在打开连接时需要特定参数,例如 dstAddr dstPort 以创建TCP / UDP的端点串口, portName baudRate serial_port_base 参数(例如,字符大小,停止位等),用于串行端口。

提供与升压插座的特定类型 T 相关的参数的最佳方法是什么?

我在考虑两种可能的解决方案:

1)从模板类继承,例如:

class TcpPortConnection : public Connection<boost::asio::ip::tcp::socket> {

public:

TcpPortConnection(
    const std::shared_ptr<IoServiceWrapper> &ioService,
    const std::shared_ptr<boost::asio::io_context::strand> &ioStrand,
    const std::string &dstAddress, uint16_t dstPort)
    : Connection(ioService, ioStrand), _dstAddress(dstAddress), _dstPort(dstPort) {}

...

}

2)模板类的多个构造函数,例如:

template<class T>
class Connection:: private boost::noncopyable, public  std::enable_shared_from_this<Connection<T>> {

            Connection(const std::shared_ptr<IoServiceWrapper> &ioService, 
                       const std::shared_ptr<boost::asio::io_context::strand> &ioStrand,
                       const std::string &dstAddress, 
                       uint16_t dstPort);


            Connection(const std::shared_ptr<IoServiceWrapper> &ioService, 
                       const std::shared_ptr<boost::asio::io_context::strand> &ioStrand,
                       const std::string &portName, 
                       uint32_t baudRate,
                       boost::tuples::tuple<boost::asio::serial_port_base::character_size,
                                            boost::asio::serial_port_base::parity,
                                            boost::asio::serial_port_base::stop_bits> SerialParams);

  ..
}  

以前的方法是否有更优雅的解决方案?

0 个答案:

没有答案