C++ std::pair()具有类似boost::optional的空值 class-LinkStats{ 公众: LinkStats(标准::共享\u ptr配置){ m_interface=“eth0”; }; ~LinkStats()=默认值; std::pair getRxLinkStats(){ 自动状态=getLinkStats(); if(nullptr!=状态){ 返回std::生成配对(状态->接收错误,状态->接收失败); } } std::pair getstxlinkstats(){ 自动状态=getLinkStats(); if(nullptr!=状态){ 返回std::make_pair(状态->发送错误,状态->发送失败); } } 私人: rtnl_link_stats*getLinkStats(){ getifaddrs(&m_ifaddr); m_interfaceaddress={m_ifaddr,[](ifaddrs*x){freeifaddrs(x);}}; 对于(ifaddrs*ifa=m_interfacedAddresss.get();ifa;ifa=ifa->ifa_next){ if((ifa->ifa\U地址->sa\U系列==AF\U数据包)&& (ifa->ifa\U数据!=NULL)&& (ifa->ifa\U地址!=空)&& (0==m_接口。比较(ifa->ifa_名称))){ 返回静态\u cast(ifa->ifa\u数据); } } 返回空ptr; } std::独特的ptr m_接口设计; IFADRS*m_ifaddr; std::字符串m_接口; };

C++ std::pair()具有类似boost::optional的空值 class-LinkStats{ 公众: LinkStats(标准::共享\u ptr配置){ m_interface=“eth0”; }; ~LinkStats()=默认值; std::pair getRxLinkStats(){ 自动状态=getLinkStats(); if(nullptr!=状态){ 返回std::生成配对(状态->接收错误,状态->接收失败); } } std::pair getstxlinkstats(){ 自动状态=getLinkStats(); if(nullptr!=状态){ 返回std::make_pair(状态->发送错误,状态->发送失败); } } 私人: rtnl_link_stats*getLinkStats(){ getifaddrs(&m_ifaddr); m_interfaceaddress={m_ifaddr,[](ifaddrs*x){freeifaddrs(x);}}; 对于(ifaddrs*ifa=m_interfacedAddresss.get();ifa;ifa=ifa->ifa_next){ if((ifa->ifa\U地址->sa\U系列==AF\U数据包)&& (ifa->ifa\U数据!=NULL)&& (ifa->ifa\U地址!=空)&& (0==m_接口。比较(ifa->ifa_名称))){ 返回静态\u cast(ifa->ifa\u数据); } } 返回空ptr; } std::独特的ptr m_接口设计; IFADRS*m_ifaddr; std::字符串m_接口; };,c++,c++11,std-pair,boost-optional,C++,C++11,Std Pair,Boost Optional,我编写了上面的类来获取链接统计信息,rx\u error,rx\u drop,tx\u error,tx\u drop 在上面的两个函数中,getRxLinkStats()和getxlinkstats(),我想知道是否有一种优雅的方法返回std::pair(),它将指示它为空,这意味着getLinkStats()失败。std::optional getRxLinkStats(){ class LinkStats{ public: LinkStats(std::shared_ptr<

我编写了上面的类来获取链接统计信息,
rx\u error
rx\u drop
tx\u error
tx\u drop

在上面的两个函数中,
getRxLinkStats()
getxlinkstats()
,我想知道是否有一种优雅的方法返回
std::pair()
,它将指示它为空,这意味着
getLinkStats()
失败。

std::optional getRxLinkStats(){
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;
};
如果(自动状态=getLinkStats()) 返回std::生成配对(状态->接收错误,状态->接收失败); } 返回{}; } std::可选的getthlinkstats(){ 如果(自动状态=getLinkStats()){ 返回std::make_pair(状态->发送错误,状态->发送失败); } 返回{}; }
对于基于boost的(即),使用
boost::optional
而不是
std::optional

std::optional
?(如果您的编译器不支持C++17和,请使用
boost::optional
),或者如果您有一些“固定”的int32_t异常值,例如std::pair,则可以使用它们来指示错误。它的开销可能比
可选的

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 {};
}