boost::typeof库中使用宏BOOST_TYPE和BOOST_AUTO来模拟C++11关键字typeof和auto

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 
/* boost_typeof.cpp
    boost中typeof库学习使用
*/

#include <iostream>
#include <vector>
#include <string>
#include <boost/typeof/typeof.hpp>
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
#define auto_t BOOST_AUTO

using namespace std;
using namespace boost;

//C++是一种静态强类型语言,所有变量在使用前都必须声明其类型
//但有时会带来麻烦,尤其是C++引入命名空间后,会导致繁琐的类型声明
//如 std::map<std::string, std::string>::iterator pos = ...;
//仅仅声明一个遍历map的迭代器,就使用了一大行
//使用using关键字打开命名空间后可以部分减少类型声明的长度,但是没有从根本是解决这样的问题
//随着编程技术的进步,将来的程序员也不可能写出冗长复杂的类型声明
//C++静态强类型的优点在这时已经成为阻碍程序员生产力的“缺陷”
//于是,C++11新增typeof和auto关键字解决上述问题

//头文件<boost/typeof/typeof.hpp> 定义的宏BOOST_TYPEOF  BOOST_AUTO
//完全模拟了C++11中typeof和auto的用法
//boost::typeof虽然支持C++和STL的大部分数据类型,但是它并没有智能到支持任何数据类型
//如果用户自定义类型想应用于type库,则需要宏注册后才能使用
vector<string> vecFunc()
{
    vector<string> vecString();
    return vecString;
}

namespace ex
{
    struct demo_class
    {
        int na;
        int nb;
    };
}
BOOST_TYPEOF_REGISTER_TYPE(ex::demo_class)          //向typeof注册类

int main(void)
{

BOOST_TYPEOF(;              //推导类型为double
);                           //推导类型为int
, "Michael Jordan")); //推导类型为pair<int, const char*>
    BOOST_AUTO(vec, vecFunc());                     //推导类型为vector<string>
    cout << typeid(x).name() << endl << endl;
    cout << typeid(y).name() << endl << endl;;
    cout << typeid(p).name() << endl << endl;;
    cout << typeid(vec).name() << endl << endl;;

BOOST_AUTO(xx, make_pair("Demo", ex::demo_class()));
    cout << typeid(xx).name() << endl << endl;;

auto_t(pd, ]);                     //推导类型为double*
    cout << typeid(pd).name() << endl << endl;;

cin.get();
    ;
}

boost实用工具:typeof库 BOOST_TYPE BOOST_AUTO的更多相关文章

  1. C++ 之Boost 实用工具类及简单使用

    本文将介绍几个 Boost 实用工具类,包括 tuple.static_assert.pool.random 和 program_options等等.需要对标准 STL 具备一定的了解才能充分理解本文 ...

  2. JavaScript和CSS实用工具、库与资源

    JavaScript和CSS实用工具.库与资源 JavaScript 库 Particles.js  - 一个用于在网页上创建漂亮的浮动粒子的 JS 库: Three.js  - 用于在网页上创建 3 ...

  3. boost实用工具:assign库了解学习

    许多时候,我们需要为容器初始化或者赋值,填入大量的数据; STL容器仅提供了容纳这些数据的方法,但是填充的步骤是相当地麻烦(insert.push_back); 于是,boost::assign出现了 ...

  4. 67 个JavaScript和CSS实用工具、库与资源

    在这篇文章中,我不会与大家谈论大型的前端框架,如 React.Angular.Vue 等,也没有涉及那些流行的代码编辑器,如 Atom.VS Code.Sublime,我只想与大家分享一个有助于提升开 ...

  5. boost实用工具:创建一个禁止复制的类 noncopyable

    boost的noncopyable允许创建一个禁止复制的类,使用很简单,但很好用!  C++ Code  12345678910111213141516171819202122232425262728 ...

  6. Lodash JavaScript 实用工具库

    地址:https://www.lodashjs.com/ Lodash 是一个一致性.模块化.高性能的 JavaScript 实用工具库.

  7. APICloud支持Atom编辑器,并建立开发工具核心库

    APICloud支持Atom编辑器开发工具 APICloud始终坚持多开发工具支持策略,开发者无论使用Sublime Text3.Eclipse还是Webstorm,都可以在APICloud平台中找到 ...

  8. IL反编译的实用工具

    初识Ildasm.exe——IL反编译的实用工具   Ildasm.exe 概要: 一.前言: 微软的IL反编译实用程序——Ildasm.exe,可以对可执行文件(ex,经典的控制台Hello Wor ...

  9. jQuery实用工具集

    插件描述:jQuery实用工具集,该插件封装了常用功能,如序列化表单值获取地址栏参数window对象操作等 此工具集包含判断浏览器,判断浏览终端,获取地址栏参数,获取随机数,数据校验等常用操作功能 引 ...

随机推荐

  1. 【Linux】rmdir命令

    用途 rmdir用于删除空目录 全称 rmdir的全称是:Remove Directory 参数 -p:连同上层空的目录一起删除 案例 现在有文件结构如下 test3 文件夹为空文件夹 test/te ...

  2. 02-maven常用命令,以及使用命令创建目录

    maven常用命令 mvn  -v 查看maven版本 compile 编译 test 测试 package 打包 clean 删除target install  安装jar包到本地仓库中. mave ...

  3. sms_queue 短信队列

    git地址:https://github.com/Filix/sms_queue 简介 通过队列的方式发送短信,暂时实现了redis作为队列. 以实现的第三方短信服务: 百悟.漫道. 发送短信方,只需 ...

  4. ISP图像质量调节介绍

    ISP(Image Signal Processor),即图像处理,主要作用是对前端图像传感器输出的信号做后期处理,主要功能有线性纠正.噪声去除.坏点去除.内插.白平衡.自己主动曝光控制等.依赖于IS ...

  5. MFC显示GIF动画图片

    本帖则将讨论如何在MFC的对话框里显示GIF动画图片.一些关于传统控件的美化方法正在研究当中会陆续发帖的. 这是本帖用到的一个VS2008例程.  附件  GifPicture.rar (138.1 ...

  6. lintcode---线段树查询||(区间元素个数)

    对于一个数组,我们可以对其建立一棵 线段树, 每个结点存储一个额外的值 count 来代表这个结点所指代的数组区间内的元素个数. (数组中并不一定每个位置上都有元素) 实现一个 query 的方法,该 ...

  7. AutoFac文档3(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 服务类型,名称和键 同 ...

  8. java开发中国际化

    1 静态文本的国际化,就是比如页面中中文显示用户名就是用户名,用于显示就是 username. 其中静态文件命名遵循:基础名_语言简称_国家简称.properties 需要使用的类是 1)import ...

  9. ie,cookie,域名与下划线

    前几天为了开发方便,和一个同事将XX.qq.com的测试站点拆成两个站点,我那个叫XX_hanks.qq.com,进行功能开发,在调试 cookie功能的时候,发现IE下cookie没有记住,用htt ...

  10. Atitit.软件gui按钮and面板---通讯子系统(区)-- github 的使用....

    Atitit.软件gui按钮and面板---通讯子系统(区)-- github 的使用.... 1. 1.注册账户以及创建仓库 1 2. 二.在GitHub中创建项目(create a new rep ...