代码之家  ›  专栏  ›  技术社区  ›  liv2hak

std::pair()具有类似boost::optional的空值

  •  0
  • liv2hak  · 技术社区  · 4 年前
    class LinkStats{
    public:
        LinkStats(std::shared_ptr<Configuration> config) {
            m_interface = "eth0";
        };
    
        ~LinkStats() = default;
    
        std::pair<int32_t, int32_t> getRxLinkStats() {
            auto status = getLinkStats();
            if(nullptr != status){
                return std::make_pair(status->rx_errors, status->rx_dropped);
            }
        }
    
        std::pair<int32_t, int32_t> getTxLinkStats(){
            auto status = getLinkStats();
            if(nullptr != status){
                return std::make_pair(status->tx_errors, status->tx_dropped);
            }
        }
    
    private:
        rtnl_link_stats* getLinkStats() {
            getifaddrs(&m_ifaddr);
            m_interfaceAddresses = { m_ifaddr, []( ifaddrs * x ) { freeifaddrs( x );}};
            for ( ifaddrs *ifa = m_interfaceAddresses.get(); ifa; ifa = ifa->ifa_next) {
                if ((ifa->ifa_addr->sa_family == AF_PACKET) &&
                    (ifa->ifa_data != NULL) &&
                    (ifa->ifa_addr != NULL) &&
                    (0 == m_interface.compare(ifa->ifa_name))) {
    
                    return static_cast<rtnl_link_stats*>(ifa->ifa_data);
                }
            }
            return nullptr;
        }
    
        std::unique_ptr<ifaddrs, std::function<void(ifaddrs*)>> m_interfaceAddresses;
        ifaddrs *m_ifaddr;
        std::string m_interface;
    };
    

    我写了上面的课程来获取链接数据, rx_error , rx_dropped , tx_error , tx_dropped .

    在上述两个功能中, getRxLinkStats() getTxLinkStats() ,我想知道是否有一种优雅的方式返回 std::pair() 这将表明它是空的,这意味着 getLinkStats() 我们失败了。

    0 回复  |  直到 4 年前
        1
  •  1
  •   Yakk - Adam Nevraumont    4 年前
    std::optional<std::pair<int32_t, int32_t>> getRxLinkStats() {
        if (auto status = getLinkStats())
            return std::make_pair(status->rx_errors, status->rx_dropped);
        }
        return {};
    }
    
    std::optional<std::pair<int32_t, int32_t>> getTxLinkStats(){
        if (auto status = getLinkStats()) {
            return std::make_pair(status->tx_errors, status->tx_dropped);
        }
        return {};
    }
    

    对于基于boost(即, ),使用 boost::optional 而不是 std::optional .