Boost库学习笔记(四)any类型

简介: Boost库学习笔记(四)any类型

Boost库学习笔记(四)any类型

一、简介

boost的本模块提供了一个泛型的类型,这个泛型类型不同于传统意义上基于模板的编程,他可以被视为一个真正可变自由的变量,而不是被固定类型静态指定,一般有以下三种用法:

可以在不同的数据类型之间灵活转换,例如将int的5解释为string的"5",反之亦然,boost::lexical_cast支持这样的转换需求。

可以容纳不同类型的值,但是不对其在不同的类型之间进行转换,比如5保持严格的int类型,不能够隐式的转换为“5”或者5.0,对其值的解释不关心,对类型的认识有效地使它们成为安全的、通用的单一值容器,不会因模棱两可的转换而产生意外。

可以随意的引用任何能够引用的东西,不关系其类型,将所有的对底层的解释交给开发人员,利用void*,可以对未定义的行为提供了充足的空间。

二、引用

<boost/any.hpp>

namespace boost {
  class any;
  void swap(any &, any &);
  template<typename T> T any_cast(any &);
  template<typename T> T any_cast(any &&);
  template<typename T> T any_cast(const any &);
  template<typename ValueType> const ValueType * any_cast(const any *);
  template<typename ValueType> ValueType * any_cast(any *);
}

<boost/any/bad_any_cast.hpp>

namespace boost {
  class bad_any_cast;
}

<boost/any/basic_any.hpp>

namespace boost {
  namespace anys {
    template<std::size_t OptimizeForSize, std::size_t OptimizeForAlignment> 
      class basic_any;
    void swap(basic_any &, basic_any &);
    template<typename T> T any_cast(basic_any &);
    template<typename T> T any_cast(basic_any &&);
    template<typename T> T any_cast(const basic_any &);
    template<typename ValueType> const ValueType * any_cast(const basic_any *);
    template<typename ValueType> ValueType * any_cast(basic_any *);
  }
}

三、实例

#include <list>
#include <boost/any.hpp>
#include <algorithm>
#include <iostream>
using boost::any_cast;
typedef std::list<boost::any> many;
void append_int(many& values, int value) {
  boost::any to_append = value;
  values.push_back(to_append);
}
void append_string(many& values, const std::string& value) {
  values.push_back(value);
}
void append_char_ptr(many& values, const char* value) {
  values.push_back(value);
}
void append_any(many& values, const boost::any& value) {
  values.push_back(value);
}
void append_noting(many& values) {
  values.push_back(boost::any());
}
bool is_empty(const boost::any& operand)
{
    return operand.empty();
}
bool is_int(const boost::any& operand)
{
    return operand.type() == typeid(int);
}
bool is_char_ptr(const boost::any& operand)
{
    try
    {
        any_cast<const char*>(operand);
        return true;
    }
    catch (const boost::bad_any_cast&)
    {
        return false;
    }
}
bool is_string(const boost::any& operand)
{
    return any_cast<std::string>(&operand);
}
void count_all(many& values, std::ostream& out)
{
    out << "#empty == "
        << std::count_if(values.begin(), values.end(), is_empty) << std::endl;
    out << "#int == "
        << std::count_if(values.begin(), values.end(), is_int) << std::endl;
    out << "#const char * == "
        << std::count_if(values.begin(), values.end(), is_char_ptr) << std::endl;
    out << "#string == "
        << std::count_if(values.begin(), values.end(), is_string) << std::endl;
}
struct property
{
    property() = default;
    property(const std::string&, const boost::any&);
    std::string name;
    boost::any value;
};
property::property(const std::string& name, const boost::any& value)
{
    this->name = name;
    this->value = value;
}
typedef std::list<property> properties;
class consumer
{
public:
    virtual void notify(const boost::any&) = 0;
    std::string name;
};
class school_consumer :public consumer {
public:
    school_consumer() = default;
    void notify(const boost::any& object) {
        std::cout << "notify:   "<< std::endl;
    }
};
int main(int argc, char** argv) {
    std::list<boost::any> myList;
    append_int(myList, 1);
    append_string(myList, "test");
    append_any(myList, 4);
    char cs = 's';
    const char* ptr = &cs;
    append_char_ptr(myList, ptr);
    append_noting(myList);
    //对所有类型计数
    count_all(myList,std::cout);
    //利用any的特性做配置的存储
    properties pros;
    property pro1("url", "https://xxx.com");
    property pro2("ConnnectionCount", 8);
    pros.push_back(pro1);
    pros.push_back(pro2);
    school_consumer scConsumer;
    scConsumer.notify(5);
    return 0;
}

运行结果:

2018122814580746.png

相关文章
|
机器学习/深度学习 缓存 网络安全
服务器中的conda环境
服务器中的conda环境
1666 1
|
Ubuntu 定位技术
百度搜索:蓝易云【ubuntu全版本通用换源教程,超详细教程】
现在,你已经成功地更换了Ubuntu系统的软件源。新的源地址将提供更快的下载速度和更稳定的软件包更新。
313 2
|
设计模式 小程序 API
小程序之页面通信&派发通知
小程序之页面通信&派发通知
|
安全 C++
【C++11保姆级教程】移动构造函数(move constructor)和移动赋值操作符(move assignment operator)
【C++11保姆级教程】移动构造函数(move constructor)和移动赋值操作符(move assignment operator)
1834 0
|
9月前
|
人工智能 监控 API
狂揽22.6k星!这个开源工具让你一键调用100+大模型,开发效率直接起飞!
LiteLLM是由BerriAI团队开发的开源项目,通过标准化OpenAI格式API接口,支持调用100+主流大语言模型(如OpenAI、Azure、Anthropic等)。其核心功能包括统一调用方式、企业级智能路由、异步流式响应及环境变量管理。项目适用于企业AI中台搭建、多模型对比测试、教育科研实验等场景。技术架构涵盖接口层、路由层、管理层与监控层,提供高效稳定的服务。相比LangChain、LlamaIndex等项目,LiteLLM在多平台混合开发方面优势显著。项目地址:https://github.com/BerriAI/litellm。
1141 2
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
557 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
存储 缓存 Linux
BTRFS- Multiple Device Support(多重设备支持)
BTRFS- Multiple Device Support(多重设备支持)
246 2
|
存储
使用KD-Tree树查找最近邻点 - 二维
使用KD-Tree树查找最近邻点 - 二维
384 0
|
Linux API C++
C++ 11 使用detach()和join()函数使用的注意点
最近做项目的时候,使用了c++11的多线程,以前做项目都是使用微软提供的一些api,比如临界区、Mutex等来实现多线程,但是比如临界区这玩意只在windows下才有,linux是没有这个概念的,所以为了跨平台,c++11之后,就提供了多线程的支持。
390 0
|
算法 Python
Hamilton问题求解-最近邻点法和最近插入法(Python实现)
Hamilton问题求解-最近邻点法和最近插入法(Python实现)
837 0
Hamilton问题求解-最近邻点法和最近插入法(Python实现)