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` 比 `void*` 更好?

如何定义 boost::any 运算符 ==

boost::any_cast 到我的自定义类

boost::any_cast - 仅在隐式转换不可用时抛出?

boost::ptr_vector 和 boost::any 的问题

Boost--any