C++常用容器、函数、类集(6)

接前一篇文章:C++常用容器、函数、类集(5)

 

本文内容参考:

C++ 强制类型转换详解:static_cast, dynamic_cast, reinterpret_cast, const_cast-CSDN博客

std::static_pointer_cast(智能指针类型转换)_智能指针 强制转换方法-CSDN博客

特此致谢!

 

14.  std::static_pointer_cast

std::static_pointer_cast是C++11引入的一个模板函数,用于将智能指针(例如std::shared_ptr、std::weak_ptr)从一种类型强制转换为另一种类型。它与static_cast类似,但专门用于智能指针。

这里,先来了解一下static_cast。

static_cast用于进行比较“自然”和低风险的转换,如整型和浮点型、字符型之间的互相转换。此外,如果对象所属的类重载了强制类型转换运算符T(如T是int、int*或其它类型名),则 static_cast也能用来进行对象到T类型的转换。

static_cast不能用于整型和指针之间的互相转换,当然也不能用于不同类型的引用之间的转换。因为这些都属于风险比较高的转换。

代码示例:

A a;
int n;
char* p = "New Dragon Inn";
n = static_cast<int>(3.14); //n的值变为3
n = static_cast<int>(a); //调用a.operator int,n的值变为1
p = static_cast<char*>(a); //调用a.operator char*,p的值变为NULL
n = static_cast<int>(p); //编译错误,static_cast不能将指针转换成整型
p = static_cast<char*>(n); //编译错误,static_cast不能将整型转换成指针

再回到std::static_pointer_cast。

语法:

std::shared_ptr<TargetType> std::static_pointer_cast<TargetType>(const std::shared_ptr<SourceType>& r);

其中:

  • TargetType:目标类型,指希望将智能指针转换为的类型。
  • SourceType:源类型,指智能指针当前所指向的类型。
  • r:要转换的智能指针对象。

作用

  • 类型转换:将一个智能指针从一种类型转换为目标类型,类似于static_cast但用于智能指针。
  • 智能指针管理功能保留:转换后的指针仍然是智能指针,它保留了引用计数和自动管理内存的功能。

代码示例:

#include <iostream> 
#include <memory>
 
class base {
public:
  // 一定要定义这个虚析构函数,否则基类无法转换为派生类
  virtual ~base() = default; 
};
 
class derived : public base {
};
 
 
int main(void) {
  // 定义两个不同的派生类对象
  std::shared_ptr<derived> derived_obj = std::make_shared<derived>();
 
  // 隐式转换 derived->base
  std::shared_ptr<base> pointer1 = derived_obj;
 
  // static_pointer_cast derived->base
  std::shared_ptr<base> pointer2 = std::static_pointer_cast<base>(derived_obj);
 
  // dynamic_pointer_cast base->derived
  std::shared_ptr<derived> pointer3 = std::dynamic_pointer_cast<derived>(pointer1);
  std::cout << (pointer3.get() == nullptr) << std::endl;
 
  // dynamic_pointer_cast base->derived
  auto pointer4 = std::dynamic_pointer_cast<test>(pointer1);
  std::cout << (pointer4.get() == nullptr) << std::endl;
 
  return 0;
}

 

15. boost::asio::steady_timer

boost::asio::steady_timer是Boost.Asio 库中的一个类,用于提供一个稳定的时间点,通常用于定时器功能。在多线程环境中,boost::asio::steady_timer提供了一种比普通boost::asio::deadline_timer更可靠的方式来测量时间间隔,因为它不受系统时间的更改或跳跃的影响。

基本用法

要使用boost::asio::steady_timer,首先需要包含Boost.Asio头文件,并确保项目已经正确配置了 Boost库。

代码示例:

#include <boost/asio.hpp>
#include <iostream>
 
int main() {
    boost::asio::io_context io;
 
    // 创建一个 steady_timer 对象
    boost::asio::steady_timer timer(io, boost::asio::chrono::seconds(5));
 
    // 设置一个异步等待操作
    timer.async_wait([](const boost::system::error_code& /*ec*/) {
        std::cout << "Timer expired!" << std::endl;
    });
 
    // 运行 io_context,这将启动异步操作
    io.run();
 
    return 0;
}

关键点:

1)创建timer

使用boost::asio::steady_timer创建一个定时器对象,并可以指定一个过期时间(例如,5秒后)。这里的过期时间是通过boost::asio::chrono::second(5)指定的。

2)异步等待

使用async_wait方法来设置一个回调函数,当定时器过期时会被调用。这里你可以处理定时器到期后的逻辑。

3)运行 io_context

io.run()会启动io_context的事件循环,这将执行所有排队的异步操作,包括定时器的到期事件。

 

更多内容请看下回。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝天居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值