码迷,mamicode.com
首页 > 其他好文 > 详细

Boost--any

时间:2019-01-05 18:17:21      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:val   struct   typeid   ack   方案   编译   技术   没有   get   

  • 介绍另一种类型any,它可以存在任意类型的数据
#include <vector>
#include <iostream>
#include <array>
#include <string>
#include "boost\any.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

标签:val   struct   typeid   ack   方案   编译   技术   没有   get   

原文地址:https://www.cnblogs.com/logchen/p/10225208.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!