c++ - std::pair() 具有空值,例如 boost::optional
问题描述
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()
是失败了。
解决方案
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(即c++11),使用boost::optional
而不是std::optional
.
推荐阅读
- perl - 为什么 perl/ptkdb 不尊重 ptkdb*
我在 .Xdefaults 中的条目? - android - 滚动条 =“垂直”在 TextView 中不起作用
- python - 如何漂亮地打印带有索引的 Python 列表?
- c++ - 我意识到这是错误的,但我无法删除它
- linux - 捕获“MemoryError”后如何继续消耗内存
- gcc - 在stdlib.h和stdio.h下使用strtol()的结果不一样
- java - 为什么java在这个例子中更喜欢父类?
- spring-boot - angular 6如何通过zuul api动态消耗rest api?
- symfony - 使用 Doctrine Extensions Translatable 不返回任何记录
- python - 熊猫时间序列数据框图不在索引中