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. android TextView异常换行层次不齐的问题

    关于TextView异常换行,参差不齐问题分析:每行的开头的第一个字符如果是字母,数字,标点符号以及特殊字符 可能是由于都是半角字符,所以需要转化成全角字符 解决方法是: public String ...

  2. Java入门到精通——调错篇之Eclipse No Java virtual machine was found after searching the following locations

    一.错误现象. 在一次启动Eclipse的时候弹出了以下的错误 二.错误原因 原因是没有找到javaw.exe文件的路径. 三.解决方式 在eclipse根文件夹下找到eclipse.ini增加以下一 ...

  3. ubuntu sudo 和su的区别

    ubuntu用户管理 sudo意思就是super-user do,让当前用户暂时以管理员的身份root来执行这条命令. su是用来改变当前用户的,su root,就是将当前用户切换为root,用了su ...

  4. Android权限注解

    Android应用程序在使用很多功能的时候必须在Mainifest.xml中声明所需的权限,否则无法运行.下面是一个Mainifest.xml文件的例子: <?xml version=" ...

  5. Windows7下搭建Android开发环境

    以后工作中要用到android开发,所以想搭建好开发环境,笔记本装的是win7 准备文件: 1 下载Android SDK http://code.google.com/android/downloa ...

  6. hibernate开发流程

    开发流程,注意:每个hibernate版本在集成的时候是不太一样的.本次使用的是hibernate-distribution-3.6.10.Final-dist 一.开发流程 1)在数据库中创建表,代 ...

  7. AngularJS实现鼠标右键事件

    常规javascript鼠标右键直接在标签上加contextmenu="alert('a')"即可,现在angular通过directive来定义一个右键指令. app.direc ...

  8. 为什么会找不到D层文件?

    近期两天在重装系统,今天好不easy把各种东西都装齐全了,再打开我的机房收费系统,就提演示样例如以下错误: 看到这个问题.我感觉非常熟,由于曾经也遇到过两次这个问题,都是改了下D层的编译路径.改到了U ...

  9. iPhone How-to:如何调整UIView的Z-Order

    转自:http://bj007.blog.51cto.com/1701577/541572 在界面设计中,最终用户看到的呈现通常是由不同层的视图组成的,通过控制视图的层次就可以实现不同的效果和功能.而 ...

  10. CXF学习笔记 之 “注解”

    @WebService 1.serviceName: 对外发布的服务名,指定 Web Service 的服务名称:wsdl:service.缺省值为 Java 类的简单名称 + Service.(字符 ...