目录
1、boost::function
1.1 概述
boost::function 是 Boost 库中提供的一个通用函数对象包装器,它可以存储指向任何可调用对象的指针,并且可以在任何时候通过 operator() 调用。这个功能类似于C++11及以后版本中的 std::function。使用 boost::function 的主要好处是可以创建类型安全的函数指针容器,可以接受不同类型的函数、成员函数、lambda 表达式或仿函数(functor)作为参数,方便在算法和数据结构中传递可调用实体。
1.2 boost包装器和C++11包装器对比
C++11和Boost库中的包装器在概念上具有相似之处,都是为了提供对可调用实体(如函数、函数指针、成员函数指针、lambda表达式以及仿函数等)的通用接口。但是它们的具体实现、依赖性以及功能细节有所不同。
相同之处:
1. 目的:两者都提供了将不同类型的可调用对象统一为一个类型安全的接口的能力,以便在需要可调用对象的地方进行传递和使用。
2. 灵活性:无论是C++11标准库中的std::function还是Boost库中的boost::function,都能存储不同类型和数量参数的可调用对象。
3. 适配器模式:它们都作为适配器模式的一种应用,允许用户以一致的方式处理多种不同的调用机制。
不同之处:
1. 标准支持:std::function是C++11及更高版本的标准库部分,不需要额外安装库即可使用;而boost::function来自Boost库,这是一个第三方开源库,需要独立安装才能在项目中使用。
2. 语法和API:虽然功能类似,但具体的声明和使用的API语法略有不同。如:在C++11中使用std::function<void(int)> f;,而在Boost中则是boost::function<void (int)> f;。
3. 性能与兼容性:由于std::function是标准库的一部分,它通常会随着编译器和标准库的更新得到更好的优化和支持。而Boost::function可能在某些旧版编译器或平台上提供更多兼容性支持。
4. 设计细节:两个类模板的内部实现细节可能有所差异,包括内存管理策略、效率表现等。随着时间推移,C++标准库的实现可能会吸取Boost库的优点并进行改进。
5. 依赖关系:如果项目仅支持C++11及以上版本,并且希望避免外部库依赖,那么std::function是首选。反之,对于早期不支持C++11的环境或者已经集成Boost库的项目,boost::function可以提供类似的便利。
6. 其他特性:除了基本的功能外,Boost库还可能包含更多相关辅助工具或扩展功能,比如与Boost.Lambda、Boost.Bind等库配合时有更丰富的功能集成。而C++11及以后的标准库本身也引入了lambda表达式和右值引用等特性,使得函数对象的创建和使用更加方便直接。
1.2、代码示例
#include <boost/function.hpp>
void free_function(int x)
{
std::cout << "Free function called with: " << x << std::endl;
}
struct MyFunctor
{
void operator()(int x) const {
std::cout << "Functor called with: " << x << std::endl;
}
};
int main()
{
boost::function<void (int)> func;
// 绑定自由函数
func = &free_function;
func(10);
// 绑定成员函数
MyFunctor functor;
func = boost::bind(&MyFunctor::operator(), &functor, _1);
func(20);
// 绑定lambda表达式
func = [](int x){ std::cout << "Lambda called with: " << x << std::endl; };
func(30);
return 0;
}
2、boost::lexical_cast
2.1 概念
lexical_cast 是 Boost 库中提供的一个方便进行类型安全的格式化转换函数,它可以将一种类型的数据转换为另一种类型,主要用于字符串与其他类型之间的相互转换。lexical_cast 会在转换过程中检查转换的有效性,如果转换失败,会抛出 boost::bad_lexical_cast 异常。
2.2 和C++11强制类型转换区别
boost::lexical_cast 和 C++11 强制类型转换的主要区别在于应用场景和功能定位:前者关注于字符串与其他类型间的安全转换,后者则是对现有类型的编译时或运行时类型转换。相同之处在于它们都提供了某种形式的类型转换功能,但 lexical_cast 更侧重于类型安全和字符串处理,而 C++11 的强制类型转换覆盖了更广泛的类型转换需求,包括但不限于对象实例间的继承关系、比特级别表示的变换以及修改对象的常量属性。
2.3 代码示例
#include <boost/lexical_cast.hpp>
#include <iostream>
int main()
{
try
{
std::string str = "42";
int num = boost::lexical_cast<int>(str);
std::cout << "The integer value is: " << num << std::endl;
// 尝试无效的转换,会抛出异常
str = "abc";
num = boost::lexical_cast<int>(str);
}
catch (const boost::bad_lexical_cast &e)
{
std::cerr << "Invalid conversion: " << e.what() << std::endl;
}
return 0;
}