std :: pair (), имеющий пустые значения с чем-то вроде boost :: необязательный - PullRequest
0 голосов
/ 26 марта 2020
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() не удалось.

1 Ответ

1 голос
/ 26 марта 2020
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 {};
}

для повышения (ie, ), используйте boost::optional вместо std::optional.

...