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