接前一篇文章: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的事件循环,这将执行所有排队的异步操作,包括定时器的到期事件。
更多内容请看下回。