Boost--any
Posted logchen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Boost--any相关的知识,希望对你有一定的参考价值。
- 介绍另一种类型any,它可以存在任意类型的数据
#include <vector>
#include <iostream>
#include <array>
#include <string>
#include "boostany.hpp"
using namespace std;
int main() {
boost::any x, y, z;
x = string("hello"); // string
x = 2.34; // double
y = ‘A‘; // char
z = vector<int>(); // any动态内存分配
// variant使用栈内存, 更高效
//cout << y << endl; // 编译不过,没有重载<<运算符
cout << boost::any_cast<char>(y) << endl; // 返回y数据的一个拷贝: ‘A‘
// boost::get() 返回引用
// boost::any_cast() 返回数据的拷贝
cout << boost::any_cast<double>(x) << endl; // 返回x数据的一个拷贝: 2.34
int i = boost::any_cast<int>(x); // 没有静态的检查,只有运行时检查
// 抛bad_any_cast异常
cout << boost::any_cast<float>(x) << endl; // bad_any_cast
boost::any_cast<vector<int>>(z).push_back(23); //23存到z的一个拷贝中
int i = boost::any_cast<vector<int>>(z).top(); // 崩,因为z的vector还是空的
boost::any p;
p = &i; // p是一个int的指针, variant can also store pointers
int* pInt = boost::any_cast<int*>(p); // returns a pointer
y.empty(); // 如果为空返回真
if (y.type() == typeid(char)) // 运行时类型检查. variant使用visitor可以编译时类型检查
cout << "y is a char" << endl;
vector<boost::any> many;
many.push_back(2);
many.push_back(‘s‘);
many.push_back(x);
many.push_back(boost::any());
struct Property {
string name;
boost::any value;
};
vector<Property> properties;
}
/*
Boost.Variant vs. Boost.Any
作为一个有鉴别能力的union容器,Variant库很很多和其他库一样的特性。但是因为没有一个是完全包含另一个库的特性,
所以不能完全用一个库替代另一个库。
Variant相比Boost的优点:
1. Boost.Variant保证内容的类型是有限的,用户指定类型的集合中的一种。
2. Boost.Variant提供了编译时检查内容的能力(与之相对地,Boost.Any 没有提供这种visitation机制;即使有也需要在运行时检查)
3. Boost.Variant能够实现对其内容的通用访问generic visitatio。 (即使Boost.Any提供了这种visitation机制,它也只能显式指定的类型支持visitation。 )
4. Boost.Variant提供了高效的,基于栈的存储方案 (避免动态分配的开销)
Boost.Any相比Boost.Variant的优点:
1. Boost.Any内容可以是任意类型,提供了更高的灵活性
2. Boost.Any提供交换操作的不抛异常的异常安全保证
3. Boost.Any很少使用模板元编程技术(避免潜在的难以阅读的错误消息以及不可忽略)
*/
以上是关于Boost--any的主要内容,如果未能解决你的问题,请参考以下文章
boost::any_cast - 仅在隐式转换不可用时抛出?