zoukankan      html  css  js  c++  java
  • 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很少使用模板元编程技术(避免潜在的难以阅读的错误消息以及不可忽略) 
    */
    
  • 相关阅读:
    数据类型
    一些骚操作
    re
    多任务
    监听按钮点击事件
    监听按钮点击事件
    监听按钮点击事件
    将博客搬至博客园
    将博客搬至博客园
    将博客搬至博客园
  • 原文地址:https://www.cnblogs.com/logchen/p/10225208.html
Copyright © 2011-2022 走看看