`

boost any与variant

阅读更多
any:是一种只能容纳一个元素的容器,但这个元素可以是任意类型(int,string,stl容器和任何自定义类型).程序可以用any保存任意的数据。
any不是一个模板类,本身不提供任何对内部元素的访问函数,而是使用了一个友元函数any_cast()
#include<boost/any.hpp>
#include<iostream>
#include<vector>
#include<boost/assign.hpp>
#include<boost/shared_ptr.hpp>
using namespace std;
using namespace boost;

template<typename T>
void print(const T& t)
{
    typename T::const_iterator iter;
    for(iter=t.begin();iter!=t.end();++iter){
        cout << *iter << " ";
    }
    cout << endl;
}

int main()
{
    any a(10);
    cout << any_cast<int>(a) << endl;
    a = string("abc");
    cout << any_cast<string>(a)<<endl;
    vector<int> v,x;
    using namespace boost::assign;
    v = list_of(1)(2)(3);
    push_back(v)(4)(5);
    a  = vector<int>(v);
    x = any_cast<vector<int> >(a);
    print(x);
    //any可以持有原始指针,但不安全,会内存泄漏。应该用智能指针,但auto_ptr不行,它特有的
    //拷贝转移语义使得它不能被用作容器的元素
    shared_ptr<int> p(new int(3));
    a = p;
    cout << *any_cast<shared_ptr<int> >(a) << endl;
}

10
abc
1 2 3 4 5 
3


variant和any有点类似,是一种可变类型,它是一个模板类,允许保存的数据类型必须在模板参数列表中声明
#include<boost/variant.hpp>
#include<iostream>

using namespace std;
using namespace boost;

template<typename T>
void var_print(T &v)
{
    if(v.type()==typeid(int)){
        get<int>(v);
        cout << v << endl;
    }else if(v.type()==typeid(string)){
        cout << v << endl;
    }else{
        try{
            cout << "don't know" << endl;
            get<int>(v);
        }catch(bad_get &){
            cout << "bad_get" << endl;
        }
    }
}

int main()
{
    //1.4.2默认最多20个
    typedef variant<int,double,string> var_t;
    var_t v;
    assert(v.type()==typeid(int));//type()用的是第一个:int
    assert(v.which()==0);

    v = "variant demo";
    var_print(v);
    v = 2.1;
    var_print(v);

}

variant demo
don't know
bad_get
分享到:
评论

相关推荐

    浅析C++中boost.variant的几种访问方法

    与`std::any`不同,`variant`限制了可存储的类型,确保了类型安全。这意味着在访问`variant`内部的值时,编译器会进行类型检查,防止了运行时类型转换错误。 **1. 使用`boost::get` 访问** 这是最直接的访问方式,...

    any组件

    4. **高级用法**:`boost::any`还可以与其他Boost组件结合使用,比如`boost::variant`,以实现更复杂的类型管理和转换逻辑。 #### 五、总结 `boost::any`作为Boost库的一个重要组件,在需要处理多种类型数据的应用...

    THE BOOST C++ LIBRARIES

    THE BOOST C++ LIBRARIES是一份自己编译的chm格式文档,描述了...14.4 Boost.Variant 14.5 Exercises Chapter 15: Error Handling 15.1 General 15.2 Boost.System 15.3 Boost.Exception Chapter 16: Cast Operators

    boost1.57.zip

    9. 编程工具:如`boost::optional`表示可能为空的值,`boost::variant`可以存储多种类型的值,`boost::any`则可以存储任何类型的值。 10. 序列化:`boost::serialization`库允许将数据序列化为XML或二进制格式,...

    boost最新官方帮助文档1.56.0

    此外,`boost::variant`和`boost::any`可以处理多种类型的数据。 6. **编译时元编程**:`boost.preprocessor`库提供了丰富的宏元编程工具,而`boost.type_traits`库则提供了类型属性检查和类型转换。 7. **序列化*...

    C++ BOOST 库中文指南

    - **数据结构**:熟悉Boost库中提供的各种高效数据结构,如元组、`Boost.Any`、`Boost.Variant`等。 - **错误处理**:掌握错误处理的最佳实践,包括`Boost.System`和`Boost.Exception`的使用方法。 - **类型转换操作...

    boost程序库导论

    - **Variant**:能够存储多种可能类型的值之一。 - **Tuple**:固定大小的复合类型,可以存储不同类型的数据成员。 ### 函数对象与高级编程 这部分讨论了Boost中用于支持函数式编程和高级编程模式的库。 - **Bind...

    Beyond The C++ Standard Library - An Introduction To Boost (2005)

    10. **其他实用工具**:可能还会介绍如`boost::variant`(多态数据类型)、`boost::any`(任意类型存储)以及`boost::mpl`(元编程库)等其他Boost组件。 通过阅读《Beyond The C++ Standard Library - An ...

    C++11/14高级编程 Boost程序库探秘 中文版 第三版 高清完整

    7. **Boost.Any** 和 **Boost_variant**:存储任意类型数据的容器,增强了代码的灵活性。 通过学习这本书,读者不仅可以掌握C++11和C++14的现代编程技巧,还能深入了解Boost库的应用,提高编程效率,编写出更高效、...

    boost中文手册.rar

    这部分可能会讲解如何配置环境,如何编译和链接Boost库,以及如何开始使用一些基础的Boost组件,例如智能指针(shared_ptr、unique_ptr)和容器(如any、variant)。 开发手册则深入到Boost的各个模块,详细解释每...

    boost.tar.gz

    5. **类型安全和错误处理**:Boost库的`boost::optional`、`boost::variant`和`boost::any`等组件增强了类型安全,使得程序更健壮。同时,`boost::spirit`库则提供了一种高级的解析器构造框架,有助于避免语法错误。...

    C++准标准库Boost介绍

    包括Any(任意类型存储),Array(固定大小数组),Compressed_pair(压缩对),Dynamic_bitset(动态位集),Graph(图算法),Iterator(迭代器工具),MultiArray(多维数组),Multi-index(多索引容器),Range...

    Boost C++ Application Development Cookbook - Second Edition - 2017.pdf

    - **多态与类型安全**:通过`boost::variant`和`boost::any`等工具增强代码的灵活性与安全性。 ##### 3. 高级特性 - **元编程**:探索Boost.MPL和Boost.StaticAssert等元编程工具,实现更高级别的抽象和编译时计算...

    variant:Variant 是一个变化的 C++11 类,它尽可能地克隆 javascript 行为

    在C++11标准下,由于没有内置的`std::variant`,开发者可能会使用第三方库,如Boost库中的`boost::variant`,或者其他自定义实现来达到类似的效果。这些早期实现通常会提供类似的API和功能,但可能没有C++17标准中的...

    boost 1.41 中文文档,使用帮助,教程手册

    汉化 boost 文档,致力 boost 推广。 如果你对本项目有兴趣,欢迎加入,相关说明请查阅项目论坛: https://groups.google.com/ 到目前为止,各人贡献的译文如下: 贡献者 贡献的译文 alai04 accumulators, any, ...

    Beyond.the.C++.Standard.Library.An.Introduction.to.Boost.pdf

    Boost中的实用工具类简化了编程,例如`Boost.Any`可以存储任意类型的对象,而`Boost.Variant`则可以存储一组预定义类型的其中一个。 4. 容器和数据结构(Containers and Data Structures): Boost提供了一些灵活的...

    超越C++标准库-boost程序库导论

    - **Boost.Variant**:支持多种类型的联合体。 - **Boost.Tuple**:提供固定大小的元组类型。 #### Smart_ptr库 - **scoped_ptr**:拥有一个非共享资源的所有权,并在其作用域结束时自动释放资源。 - **scoped_...

Global site tag (gtag.js) - Google Analytics