boost.any实现任意类型存储

Boost Any Cast测试程序 在上述的测试程序中,我们使用boost::type_erasure::any和boost::type_erasure::member等机制来定义具有任意类型的变量,同时将它们绑定到我们自己定义的接口函数中。通过调用boost::type_erasure::any_cast和绑定的成员函数,我们可以在运行时获取存储在变量中的实际数据。Boost库是一个C++语言的开源跨平台工具库,其中boost::type_erasure::any_cast是该库中涉及的一个类型擦除和多态性实现机制。 阅读详情
当你需要一个可变的类型时,有三种可能的解决方案:
  1. 无限制的类型,如 void*. 这种方法不可能是类型安全的,应该象逃避灾难一样避免它。
  2. 可变的类型,即支持多种类型的存储和获取的类型。
  3. 支持转换的类型,如字符串类型与整数类型之间的转换。
Any实现了第二种方案,一个基于值的可变化的类型,无限可能的类型。这个库通常用于把不同类型的东西存储到标准库的容器中。

Any 库如何改进你的程序
任意类型的类型安全存储以及安全的取回
在标准库容器中存放不同类型的方法
可以在无须知道类型的情况下传送类型

Any库提供一个类型, any, 它允许存入任意类型且稍后取回,而不损失类型安全性。它有点象是可变类型的化合物:它可以持有任意类型,但你必须知道类型才能取回值。有很多次你想在同一个容器中存入互不相关的类型。有很多次某些代码只想从一个指针向另一个指针传送数据,而不关心数据的类型。从表面看,这些事情很容易做。它们可以通过一个无类的类型来实现,如 void*. 它们也可以通过使用一个含有不同类型的union来实现。有很多可变类型通过一些类型标识机制来实现。不幸的是,所有这些都缺乏类型安全性,而只有在最可控的情形下我们才应该故意绕过类型系统。标准库的容器是要通过它们所包含的类型来特化的,这意味着不可能把不同类型的元素存入容器之内。幸运的是,解决的方案不一定要 void*, 因为 Any 库允许你将存入不同的类型而稍后取回。没有办法在不知道实际类型的情况下取回存入的值,类型安全从而得到保证。

在设计框架时,不可能预先知道哪些类型要和框架类一起使用。一个常见的方法是,要求框架的使用者遵守某种接口,或者从框架所提供的某个基类进行派生。这是合理的,因为框架可能需要与不同的高级类进行通信才能使用。但是也存在这样的情形,框架对于存入或接受的类型无须(或不能)知道任何相关信息。不要绕过类型系统去使用 void* 方法,框架可以使用 any 。

Any 如何适用于标准库
Any的一个重要特性是,它提供了存储不同类型的对象到标准库容器中的能力。它也是一种可变数据类型,这正是C++标准库非常需要而又缺乏的。

Boost.Any
类 any 允许对任意类型进行类型安全的存储和取回。不象无类类型,any 保存了类型信息,并且不会让你在不知道正确类型的情况下获得存入的值。当然,有办法可以让你询问关于类型的信息,也有测试保存的值的方法,但最终,调用者必须知道在 any 对象中的值的真实类型,否则不能访问any。可以把 any 看作为上锁的安全性。没有正确的钥匙,你不能进入其中。any 对它所保存的类型有以下要求:
  1. CopyConstructible 它必须可以复制这个类型
  2. Non-throwing destructor 就象所有析构函数应该的那样!
  3. Assignable 为了保证强异常安全(不符合可赋值要求的类型也可以用于 any, 但没有强异常安全的保证)
namespace boost {

  class any {
  public:
    any();
    any(const any&);

    template<typename ValueType>
     any(const ValueType&);

    ~any();

    any& swap(any &);
    any& operator=(const any&);

    template<typename ValueType>
     any& operator=(const ValueType&);

    bool empty() const;
    const std::type_info& type() const;
  };
}

成员函数

any();
缺省构造函数创建一个空的 any 实例,即一个不含有值的 any。当然,你无法从一个空的any中取回值,因为没有值存在。

any(const any& other);
创建一个已有 any 对象的独立拷贝。other 中含有的值被复制并存入 this.

template<typename ValueType> any(const ValueType&);
这个模板构造函数存入一个传入的ValueType类型参数的拷贝。参数是一个 const 引用,因此传入一个临时对象来存入any是合法的。注意,该构造函数不是 explicit 的,如果是的话, any 会难以使用,而且也不会增加安全性。

~any();
析构函数销毁含有的值,但注意,由于对一个裸指针的析构不会调用operator delete 或 operator delete[] ,所以在any中使用指针时,你应该把裸指针包装成一个象 shared_ptr 那样的智能指针。

any& swap(any& other);
交换存在两个 any 对象中的值。

any& operator=(const any& other);
如果any实例非空,则丢弃所存放的值,并存入other值的拷贝。

template<typename ValueType>  any& operator=(const ValueType& value);
如果any实例非空,则丢弃所存放的值,并存入 value 的一份拷贝,value可以是任意符合any要求的类型。

bool empty() const;
给出any实例当前是否有值,不管是什么值。因而,当any持有一个指针时,即使该指针值为空,则 empty 也返回 false 。

const std::type_info& type() const;
给出所存值的类型。如果 any 为空,则类型为 void.

普通函数

template<typename ValueType>  ValueType any_cast(const any& operand);
any_cast 让你访问any中存放的值。参数为需要取回值的 any 对象。如果类型 ValueType 与所存值不符,any 抛出一个 bad_any_cast 异常。请注意,这个语法有点象 dynamic_cast.

template<typename ValueType>  const ValueType* any_cast(const any* operand);
any_cast 的一个重载,接受一个指向 any 的指针,并返回一个指向所存值的指针。如果 any 中的类型不是 ValueType, 则返回一个空指针。请再次注意,这个语法也有点象 dynamic_cast.

template<typename ValueType>  ValueType* any_cast(any* operand);
any_cast 的另一个重载,与前一个版本相似,但前一个版本使用 const 指针的参数并返回 const 指针,这个版本则不是。

异常
bad_any_cast

当试图将一个any对象转换为该对象所存类型以外的其它类型,将抛出该异常。bad_any_cast 派生自 std::bad_cast. 注意,使用指针参数调用 any_cast 时,将不抛出异常(类似于对指针使用 dynamic_cast 时返回空指针一样),反之对引用类型使用 dynamic_cast 则会在失败时抛出异常。

用法
Any库定义在名字空间 boost 内。你要用类 any 来保存值,用模板函数 any_cast 来取回存放的值。为了使用 any, 要包含头文件 "boost/any.hpp". any 只允许你在知道类型的前提下访问它的值,这是很明智的。对于这个库,典型情况下你只需记住两件事:类 any, 用于存放值,还有模板函数 any_cast, 用于取回值。
在转型失败不是一种错误时,使用指针来传递 any, 但如果转型失败是一种错误,则应该使用const引用来传递,这样可以让 any_cast 在失败时抛出异常。如果你传递一个指针参数,你会得到一个指向保存值的指针;如果你传递一个 const 引用参数,你会得到一个保存值的拷贝。如果值的类型在拷贝时代价很昂贵,就应该传递指针以避免值的拷贝。
使用 any 让你能够在原来不能使用标准库容器和算法的地方下使用它们,从而让你可以写出更具有可维护性和更易懂的代码。

#include <iostream>
#include <string>
#include <utility>
#include <vector>
#include <boost/any.hpp>

using namespace std;

struct A
{
        void some_function() { cout << "A::some_function()" << endl; }
};

struct B
{
        void some_function() { cout << "B::some_function()" << endl; }
};

struct C
{
        void some_function() { cout << "C::some_function()" << endl; }
};

void print_any(boost::any& a)
{
        if (A* pA=boost::any_cast<A>(&a))
        {
                pA->some_function();
        }
        else if (B* pB=boost::any_cast<B>(&a))
        {
                pB->some_function();
        }
        else if (C* pC=boost::any_cast<C>(&a))
        {
                pC->some_function();
        }
        else
        {
                try
                {
                        cout << boost::any_cast<string>(a) << endl;
                }
                catch(boost::bad_any_cast &e)
                {
                        cout << "Oops~" << e.what() << endl;
                }
        }
}

int main()
{
        std::vector<boost::any> store_anything;

        store_anything.push_back(A());
        store_anything.push_back(B());
        store_anything.push_back(C());

        store_anything.push_back(string("This is fantastic! "));
        store_anything.push_back(3);
        store_anything.push_back(make_pair(true, 7.92));

        for_each( store_anything.begin(),
                        store_anything.end(),
                        print_any);
}

执行结果:
A::some_function()
B::some_function()
C::some_function()
This is fantastic!
Oops~boost::bad_any_cast: failed conversion using boost::any_cast
Oops~boost::bad_any_cast: failed conversion using boost::any_cast

成员函数使用
#include <iostream>
#include <string>
#include <boost/any.hpp>

using namespace std;

int main()
{
        boost::any a1(100);
        boost::any a2(std::string("200"));
        boost::any a3;

        cout << "a3 is " << (a3.empty() ? "empty" : "not empty" )<< endl;

        a1.swap(a2);
        try
        {
                string s=boost::any_cast<std::string>(a1);
                cout << "a1 contains a string: " << s << endl;
        }
        catch(boost::bad_any_cast& e)
        {
                std::cout << "a1 doesn't contain a string! " << e.what() << endl;
        }

        if (int* p=boost::any_cast<int>(&a2))
        {
                cout << "a2 seems to have swapped contents with a1: "  << *p << endl;
        }
        else
        {
                cout << "Nope, no int in a2" << endl;
        }

        if (typeid(int)==a2.type())
        {
                cout << "a2's type_info equals the type_info of int" << endl;
        }
}

执行结果:
a3 is empty
a1 contains a string: 200
a2 seems to have swapped contents with a1: 100
a2's type_info equals the type_info of int

保存指针
通常,测试 empty 足以知道对象是否真的包含有效的东西。但是,如果 any 持有的是一个指针,则要在解引用它之前额外小心地测试这个指针。仅仅简单地测试 any 是否为空是不够的,因为一个 any 在持有一个指针时会被认为是非空的,即使这个指针是空的。

在 any 中保存裸指针的另一个麻烦在于析构的语义。any 类接受了它所存值的所有权,因为它保持一个该值的内部拷贝,并与 any 一起销毁它。但是,销毁一个裸指针并不会对它调用 delete 或 delete[] !它仅仅要求归还属于指针的那点内存。这使得在 any 中保存指针是有问题的,所以更好的办法是使用智能指针来代替。的确,使用智能指针是在一个 any 中保存指针的好办法。它解决了要保证所存指针指向的内存被正确释放的问题。当智能指针被销毁时,它会正确地确保内存及其中的数据被正确销毁。作为对比,要注意 std::auto_ptr 不是合适的智能指针。这是因为 auto_ptr 没有通常的复制语义;访问一个 any 中的值会把内存及其中数据的所有权从 any 转移到返回的 auto_ptr 中。
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <boost/any.hpp>
#include <boost/shared_ptr.hpp>

using namespace std;

class A
{
        private:
                string m_str;
        public:
                A(string str):m_str(str){}
                virtual ~A() {cout << "A::~A()---" << m_str << endl; }
                void not_virtual() {cout << "A::not_virtual()---" << m_str << endl;}
                virtual void is_virtual () {cout << "A:: is_virtual ()---" << m_str<< endl;}
};

class B : public A
{
        private:
                string m_str;
        public:
                B(string str):A(str),m_str(str){}
                ~B(){cout << "B::~B()---" << m_str << endl;}
                void not_virtual() {cout << "B::not_virtual()---" << m_str << endl;}
                virtual void is_virtual () {cout << "B:: is_virtual ()---"<< m_str << endl;}
};

void foo(boost::any& a)
{
        try
        {
                boost::shared_ptr<A> ptr = boost::any_cast<boost::shared_ptr<A> >(a);
                ptr-> is_virtual ();
                ptr->not_virtual();
                return;
        }
        catch(boost::bad_any_cast& e) {}

        try
        {
                boost::shared_ptr<B> ptr = boost::any_cast<boost::shared_ptr<B> >(a);
                ptr-> is_virtual ();
                ptr->not_virtual();
                return;
        }
        catch(boost::bad_any_cast& e) {}

        cout << "~~~~~~~other types~~~~~~~~" << endl;
}
int main()
{
        boost::any a1(boost::shared_ptr<A>(new A("a1")));
        boost::any a2(string("Just a string"));
        {
                boost::any b1(boost::shared_ptr<A>(new B("b1")));
                boost::any b2(boost::shared_ptr<B>(new B("b2")));
                vector<boost::any> vec;
                vec.push_back(a1);
                vec.push_back(a2);
                vec.push_back(b1);
                vec.push_back(b2);

                for_each(vec.begin(),vec.end(),foo);
                cout << endl;
        }
}

执行结果:
A:: is_virtual ()---a1
A::not_virtual()---a1
~~~~~~~other types~~~~~~~~
B:: is_virtual ()---b1
A::not_virtual()---b1
B:: is_virtual ()---b2
B::not_virtual()---b2

B::~B()---b2
A::~A()---b2
B::~B()---b1
A::~A()---b1
A::~A()---a1   
vector 中的含有 string 的 any 。这显示了保存一些对稍后要被调用的函数而言是未知类型的类型到一个 any,是很有可能的,通常也是合理的;这些函数只需要处理它们需要操作的类型!

第三个元素含有一个指向 B 实例的 shared_ptr<A> 。这个例说明了 any 如何与其它类型一样实现多态性。当然,如果我们使用裸指针,就需要用 static_cast 来保存指针为我们想标识的类型。注意,函数 A::not_virtual 被调用而不是 B::not_virtual. 原因是这个指针的静态类型是 A*, 而不是 B*.
在里面的那个作用域结束时,vector 被销毁,它又销毁了内含的 any 实例,后者再销毁所有的 shared_ptr,正确地设置引用参数为零。接着,我们的指针被安全和不费力气地销毁!

这个例子显示了一些比如何与 any 一起使用智能指针更为重要的东西;它显示了存入 any 的类型有是简单的或是复杂的都无关紧要。如果复制被存值的代价是高得惊人的,或者如果需要共享使用和控制生存期,就应该考虑使用智能指针,就象使用标准库的容器保存值一样。同样的推理也适用于 any, 通常这两个原则是一致的,正如在容器中使用 any 就意味着要保存不同的类型。


总结
这个类型可以包含不同类型的值,而且与无类类型(如 void*)有很大不同。我们总是严重地依赖C++中的类型安全,只有在极少数情形下我们会愿意没有它来干活。这是有很好的原因的:类型安全防止我们犯错,并改善了我们代码的性能。因此,我们应该避免无类类型。还有,发现自己需要异类存储的情形很少见,或者为了将使用者隔离于类型的细节,或者为了在更低的层次获得极度的灵活性。any 提供了这些功能,同时维护了类型安全,它是我们的工具箱的最好扩充!

在以下情形时使用 Any 库:
  1. 你需要在容器中存放不同类型的值
  2. 需要保存未知类型
  3. 类型被传递到无须知晓任何有关该类型信息的层次
Any 的设计同时也是一门很有价值的课程,关于如何封装一个类型而不影响到该类型的封套类。这种设计可以用于创建泛型函数对象、泛型迭代器等等。它是一个展示封装的威力以及与模板相关的多态性的例子。

在标准库中,有很好的工具来存放多个元素。当需要存储异类的元素时,我们想避免使用新的集合类型。any 提供了一种方法,在大多数情况下它可以与已有容器一起使用。在某种程度上,模板类 any 扩展了标准库容器的能力,把不同的类型封入一个同类型的包装中,就可以把它们放入前述容器中了。把 Boost.Any 加到已有代码中是很简单的。它不需要修改设计,并且立即就增加了灵活性。接口非常小,这使得它成为一个很容易理解的工具。


2023-12-26~2025-07-04备份 一、海康视觉与汇川机器人 服务器-客户端通信设置IP在同一网段名称IP端口类型海康相机工控机7930服务器机器人3000客户端海康VM服务器设置1通信管理 增添TCP服务端,设置本机IP:192.168.0.20,端口号79302 协议解析 通信双方约定通信格式(设置收发数据格式,分隔符)机器人客户端设置(不同类型机器人设置有差别)1 通讯服务设置 设置连接服务器IP、服务端端口号、机器人端口号,确保连接正常2 协议解析 使用指令代码构建通讯解析。 阅读详情

相关推荐

一文读懂资管系统里的“清算路径”:钱和券的“导航地图”

简单来说,清算路径就是给每一笔交易预设好的“导航路线”。钱从哪个银行账户出?通过哪家证券公司去买?用哪个股东账户去登记?买回来的股票记在谁的名下?“清算路径”就是把这一连串问题的答案提前配置好。它连接了银行托管户(钱的源头)、券商(交易的中介)和交易所(买卖的市场)。没有配好这条路,交易就无法闭环。清算路径是金融基础设施的缩影。资金如何安全地从银行流向市场;资产如何合法地归属到产品名下;交易数据如何在不同系统间流转。它是资管系统能够日复一日、准确无误地处理亿万级交易的基石。

m0_37607945的博客 235

boost::any

发信人: flier (小海 (:好日子不多了:)), 信区: Programming标  题: boost::any发信站: BBS 水木清华站 (Mon May 13 12:02:24 2002)我来抛砖,有人跟进吗?:)boost::any  boost::any是一个很有趣的类,刚刚开始我还以为其就是一个variant类型,能够将任意类型值保存进去,能够以任意类型值读出来,不过

huxw的专栏 1355

AI for Science:GNN预测分子性质全流程详解与工业实践

从分子表示到工业落地,一文掌握图神经网络在药物研发与材料设计中的核心实战近年来,的浪潮正深刻变革着传统科研范式。在药物研发与材料设计领域,作为核心环节,已从传统的实验试错转向基于图神经网络(GNN)的智能计算。本文将深入解析GNN预测分子性质的,涵盖数据准备、模型设计、训练优化到工业部署,并揭秘前沿技术与实战案例。

datacanvas2426的博客 1674

boost I 容器与数据结构(三)

目录 六、tuple 1.std::pair 2.创建tuple对象 3.访问元素 4.比较操作 5.输入输出 6.联结变量 7.扩展 a.使用get_head 和get_tail遍历 b.tuples::element c.tuples::length d.与C++标准库std::tuple的对比 七、any 1.访问元素 2.any的应用 3.与C++标准库对比 六、tuple tuple ( 元组)定义了一个有固定数目元素的容器,其中的每个元素类型...

该用户还没想到好的昵称的博客 1740

AI驱动的数据完整性:ECC到S/4HANA迁移

在SAP ECC到S/4HANA的迁移过程中,数据完整性验证是最复杂且关键的挑战之一。本文介绍了一个全面的AI驱动的端到端数据完整性框架,用于对账事务数据并验证数百万条主数据记录和事务记录的完整性。该框架结合了模式映射、自然语言提示到SQL生成、基于LLM的解决方案、大规模数据对账的数据完整性工具、基于云的测试数据管理以及实时Power BI仪表板,为开发者提供了一个可重复、可扩展的工作流程,确保ERP迁移过程中的数据质量。

简简单单Onlinezuozuo 1172

Unity Acceleratorc与Cache Server unity的缓存服务器

文章目录1.作用概述2.用法(使用,看这个就够了)服务端下载部署Unity Acceleratorc修改http管理端口修改Editor连接端口客户端使用(设置好一次提交设置,团队拉取即可全部生效)3.测试平台切换测试资源导入测试(打开编辑器的情况下)项目启动测试(不打开编辑器的情况下)4.不同版本表现5.服务端监控6.服务端缓存7.冲突8.预警9.不同项目/不同配置-同种资源10.缓存清除 1.作用概述 编辑器模式下,导入资源,切换平台unity都会重新识别资源,大型项目很浪费时间,使用Cache Ser

euphorias的博客 3812

boost any

Boost.Any Any库支持类型安全地存储和获取任意类型的值。当你需要一个可变的类型时,有三种可能的解决方案: 无限制的类型,如 void*. 这种方法不可能是类型安全的,应该象逃避灾难一样避免它。 可变的类型,即支持多种类型的存储和获取的类型。 支持转换的类型,如字符串类型与整数类型之间的转换。 Any实现了第二种方案,一个基于值的可变化的类型,无限可能的类型。这个

supermanwg的专栏 1218

告别环境配置烦恼:Docker容器化一站式搭建Zephyr RTOS开发环境

本文详细介绍了如何使用Docker容器化技术一站式搭建Zephyr RTOS开发环境,彻底解决环境配置不一致、依赖冲突等难题。通过预构建镜像、数据卷挂载和实战编译示例,帮助开发者快速获得隔离、一致且可复现的嵌入式开发环境,大幅提升开发效率和团队协作体验。

n8m7b6v5c4的博客 189

BOOST库之Conversion[1]

     Conversion库由四个转换函数组成,分别提供了更好的类型安全性(polymorphic_cast),更高效的类型安全防护(polymorphic_downcast),范围检查的数字转换(numeric_cast), 以及文字转换(lexical_cast).      由于dynamic_cast对指针和引用类型的不同行为(对指针转型失败不抛出异常). The value of

sunwenjun的专栏 595

从Protocol到硬件控制:揭秘高通UEFI中ABL与XBL的协作机制

本文深入解析了高通UEFI架构中ABL与XBL的协作机制,重点探讨了Protocol通信在硬件控制中的关键作用。通过对比传统GPIO控制方式,揭示了Protocol架构在安全性、可维护性和灵活性方面的优势,并提供了关机充电场景的实战案例分析及调试技巧。

weixin_29185199的博客 430

STM32CUBEIDE调试中HardFault_Handler崩溃的故障分析器实战解析

本文详细解析STM32CUBEIDE调试中HardFault_Handler崩溃问题的实战处理方法。通过内置故障分析器自动诊断硬件异常原因,如内存越界、堆栈溢出等,提供图形化界面简化调试流程,并分享配置步骤、典型案例及高级调试技巧,帮助开发者快速定位和解决嵌入式系统崩溃问题。

night的博客 643

[C++] C++中boost::any的使用

boost::any库是个很短小的类,它的主要作用是定义一个变量来存放任意类型的数据,我们首先来看下boost::any的使用方法。 boost::any最常见的用法#include <iostream> #include <list> #include <boost/any.hpp>typedef std::list<boost::any> list_any; // 类型定义void fill_l

Glemontree's blog 1万+

基于深度学习的交通标志识别系统:使用YOLOv10、UI界面及自定义数据集的实现

实时检测和分类交通标志。提供一个友好的用户界面,方便用户上传图片或视频进行检测。收集和显示检测结果,以便进行进一步分析。YOLO(You Only Look Once)是一种高效的目标检测算法,它能够在一次前向传播中同时进行目标定位和分类。YOLOv10是YOLO系列的最新版本,具有更好的检测精度和速度。本项目成功实现了基于YOLOv10的交通标志检测与识别系统。通过实时检测与分类,系统能够有效识别出各种交通标志,为智能交通应用提供支持。

YOLO 1234

boost::any类型实现原理

boost::any是一种通用类型,可以存放任意值。 问题:通用类型any如何存放任意值? A: 这里的通用类型类似于脚本语言中的类型。 方案一, union结构体:但union只能存放固定种类的值,没有扩展性。 方案二, void *类型: C++是强类型语言,用void *保存后丢失了类型信息,很难保证类型安全。 方案三, 模板: 模板需要参数化,any = 1; any = 1.0

Da Cheng Xu 的专栏 3680

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

引领Boost(二)(Boost::Any)

 在boost中有boost::Any为我们提供了类似java或.net中的object类型,boost::Any能够代表任意类型,实现任意类型的类型安全存储以及安全的取回,常用在将不同类型的对象存储在标准容器中 一 Boost::Any 很多时候我们想有一种可以代表任何类型的类型,比如像纯面向对象语言java或.net中的Object类型,但是对于C++本身并没有这样一个基类,所以我...

weixin_30360497的博客 106

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

[zz]万能类型boost::any

个人总结: 很好用的任何类型。注意记住 any.type() == typeid(int)这种比较用法 --------------------------------------------------------我是无情的分割线----------------------------------------------------------------- 万能类型boost::any ...

weixin_33716941的博客 260

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

boost数据结构any(很有用!)

any是一种特殊的容器,它只能容纳一个元素,但这个元素可以是任意类型;可以用any保存任何类型,在任何需要的时候取出它;这种功能和shared_ptr<void>类似,但是any是类型安全的;any不是一个模板类,但是其有模板构造函数,从而实现任意类型;空的any构造函数创建一个空的any对象,不持有任何值;成员函数empty()可判断a...

weixin_30509393的博客 140

Boost::any分析

使用第三方库 以上介绍了Visual C++对对象赋值、转换及字符编码转换的方法,实际上还有一些好用的第三方类库用以辅助C++程序员完成对象处理,比较著名的就是boost。本节简单介绍boost库中与数值相关的boost::any、boost::lexical_cast,以及有理数类boost::rational。 4.6.1  万能类型boost::any boost库提供了any类,

flyingleo1981的专栏 1367

C++11 Boost Any类实现

#include "pch.h" #include &lt;iostream&gt; #include &lt;memory&gt; #include &lt;typeindex&gt; using namespace std; /* 类似于boost Any类的实现 */ struct Any { public: Any(void) :m_tpIndex(type_index(typ...

crkres9527 787

boost.any源码整理和使用说明

Source #include &lt;algorithm&gt; #include &lt;typeinfo&gt; #include "boost/config.hpp" #include &lt;boost/type_traits/remove_reference.hpp&gt; #include &lt;boost/type_traits/is_reference.hpp&g...

kimi's blog 142

boost源码剖析之:泛型指针类any之海纳百川(rev#2)

boost源码剖析之:泛型指针类any之海纳百川(rev#2) 刘未鹏 C++的罗浮宫(http://blog.csdn.net/pongba) 动机 C++是强类型语言,所有强类型语言对类型的要求都是苛刻的,类型一有不合编译器就会抱怨说不能将某某类型转换为...

chuifuhuo6864的博客 112

Ogre源码剖析 - 任意类型类Any

Ogre源码剖析: 任意类型类 Any 有些时候我们可能想做这样一件事:float f = 1.f;int n = 2;std::vector myContainer;           // X是一个虚构的用户定义类型myContainer.pushback(X(f));myContainer.pushback(X(n)); 我们想在一个容器里保存两种乃至多

痞子龙3D编程 1930

软件架构设计之Utility模块——Any

YKAny类用于保存任意类型的变量类似于variant_t。这里采用的是boost库中的Any实现原理,增加了两个Any之间比较的功能。看代码吧: class UTIL_API YKAny { class PlaceHolder { public: PlaceHolder() {} virtual ~PlaceHolder() {} virtual const std::ty

backo880607的专栏 1723
上一篇: C++智能指针之auto_ptr
下一篇: boost智能指针之shared_ptr和weak_ptr
IT_Linux
博客等级 码龄14年 31粉丝 77原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值