boost--BOOST_AUTO、typeof、result_of

1、BOOST_AUTO

BOOST_AUTO的功能类似于auto和any,可以用来定义任意类型数据,且可以在编译时自动推导出表达式的类型。BOOST_AUTO属于boost中的typeof库,使用需要包含"boost/typeof/typeof.hpp"。

当使用BOOST_AUTO用来定义引用类型的时候需要加&。

#include <vector>
#include <boost/typeof/typeof.hpp>
int main()
{
    BOOST_AUTO(x, 5); //x为int类型,初始值为5
    int n = 10;
    BOOST_AUTO(&i, n);//加了&表示引用,所以i为int&类型,初始值为10
    BOOST_AUTO(p, new char[20]);  //p为char*类型
    BOOST_AUTO(v, vector<int>(10, 0)); //v为vector<int>类型,初始为包含10个值为0的元素
    BOOST_AUTO(ptr, &n); //ptr为int*类型,指向n
    BOOST_AUTO(y, n * 5); //y为int类型,初始值为n * 5

    return 0;
}

2、typeid

typeid是C++中的关键字,使用它可以获得变量或表达式的类型,它返回的是type_info类型的对象,type_info类的成员函数name()用来获得具体类型的字符串,还支持==、!=判断。

如果测试的对象是类类型且至少包含有一个虚函数,则typeid是在运行时获得对象的类型;否则,typeid在在编译时就可以计算出对象的类型。

int n = 10;
cout << typeid(n).name() << endl;
cout << typeid(&n).name() << endl;

cout << typeid(double).name() << endl;

Base base;
Base * pBase = new Derived;
cout << typeid(base).name() << endl; //输出class Base
cout << typeid(pBase).name() << endl; //输出class Base*
cout << typeid(*pBase).name() << endl; //输出class Derived

3、BOOST_TYPEOF、typeof、decltype

我们一般使用BOOST_AUTO、auto、any来直接定义变量,变量的数据类型在编译的时候通过保存的数据来导出;使用BOOST_TYPEOF、typeof、decltype也用来直接定义变量,但变量的数据类型根据指定变量或表达式的数据类型来导出。

①、BOOST_TYPEOF属于boost中的typeof库,使用需要包含"boost/typeof/typeof.hpp"。

#include <vector>
#include <boost/typeof/typeof.hpp>
int main()
{
    BOOST_TYPEOF(5) x = 10; //x为int类型,初始值为10
    int n = 10;
    BOOST_TYPEOF(n) y = 0; //y为int类型,初始值为0
    BOOST_TYPEOF(&n) p = NULL; //p为int*类型,初始值为NULL
    double d = 2.0;
    BOOST_TYPEOF(n + d) pi = 3.14; //pi为double类型,初始值为3.14

    return 0;
}

②、typeof是GUN C中的关键字。

    int n = 999;
    typeof(n) var = 666; //var为int类型,初始值为666

    int var = 666;
    typeof(&var) pVar = NULL; //pVar为int*类型,初始值为NULL

    typeof(var * n) value = 0; //value为int类型,初始值为0

③、decltype是c++11中的关键字,如果表达式是左值类型的,则返回的是对应的引用类型。

int main()
{
    int n = 666;
    decltype(n) var = 0; //var为int类型,初始值为0

    int* pVar = NULL;
    decltype(pVar) pNum = NULL; //pVar为int*类型,初始值为NULL

    int* pV = NULL;
    decltype(*pV) Num; //error:*pV是左值类型,所以Num是一个引用,必须初始化

    int FuncName();
    decltype(FuncName())  value = 666; //value为int类型,初始值为666

    decltype(n * 3.0) pi = 3.14; //pi为double类型,初始值为3.14

    return 0;
}

4、result_of

result_of<>可以获得一个调用表达式的返回类型,调用表达式是一个含有operator()的表达式,它可以是一个函数指针、函数引用、函数对象。

可以通过result_of<>的内部类型定义type来获得具体类型,假设类型Func可被调用(具有operator()),func是Func类型的一个左值,那么typeid(boost::result_of<Func(T1, T2, ...)>::type) 必然等于typeid(func(t1, t2, ...))。

c++11现在已经支持result_of。

①、result_of<>可以获得函数指针的类型,而typeof只能获得函数表达式的类型:

#include "boost/utility/result_of.hpp"

int main()
{
    typedef double(*Func)(double d);
    //Func func = sqrt;
    boost::result_of<Func(double)>::type x = sqrt(5.0);

    return 0;
}

②、result_of<>获得函数调用表达式的类型:

#include "boost/utility/result_of.hpp"

typedef int(*FuncPtr)(int d);
typename boost::result_of<FuncPtr(int)>::type Func(FuncPtr t, int t1) //这里在result_of<>前必须加typename,否则编译出错
{
    return t(t1);
}

int main()
{
    typedef int(*FuncPtr)(int d);
    FuncPtr func = abs;
    Func(func, -5);

    return 0;
}

③、result_of<>还可以获得泛型函数调用表达式的类型:

#include "boost/utility/result_of.hpp"

template<typename T, typename T1>
typename boost::result_of<T(T1)>::type Func(T t, T1 t1) //这里在result_of<>前必须加typename,否则编译出错
{
    return t(t1);
}

int main()
{
    typedef int(*FuncPtr)(int d);
    FuncPtr func = abs;
    Func(func, -5);

    return 0;
}

时间: 2024-07-30 21:50:08

boost--BOOST_AUTO、typeof、result_of的相关文章

原生JS:delete、in、typeof、instanceof、void详解

delete.in.typeof.instanceof.void详解 本文参考MDN做的详细整理,方便大家参考[MDN](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript) delete delete 运算符用来删除对象的自有属性. 语法:delete expression expression 的计算结果应该是一个对象的属性引用,如果不是一个对象的属性引用,那么,delete不会起任何作用,直接返回true. 在严格模式中,如果属性

indexOf、instanceOf、typeOf、valueOf详解

1.indexOf() 该方法用来返回某个指定的字符串值在字符串中首次出现的位置. 语法:indexOf(searchvalue,fromindex);两个参数,参数一表示查询的字符串值,参数二可选表示开始查询的起始位置,若不写默认从首字符开始查询 1 var string = "abcdeADhu390u09"; 2 console.log(string.indexOf("d"));//3 注意下标值从0开始 3 console.log(string.indexO

JS代码预解析原理、函数相关、面向对象

JS重要知识点 这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原理(包括三个段落): 函数相关(包括 函数传参,带参数函数的调用方式,闭包): 面向对象(包括 对象创建.原型链,数据类型的检测,继承). JS代码预解析原理 /****************** JS代码预解析原理 ******************//*JS代码预解析.变量作

Javascript中的null、undefined、NaN

1.判断彼此是否相等 function btnClick(){     alert(null == null);//true     alert(undefined==undefined);//true     alert(NaN==NaN);//false } 总结: (1)两个null是相等的 (2)两个undefined是相等的 (3)两个NaN是不相等的 function btnClick(){     alert(null == undefined);//true     alert(

0101 JavaScript标识符、关键字、保留字

10.1 标识符 标识(zhi)符:就是指开发人员为变量.属性.函数.参数取的名字. 标识符不能是关键字或保留字. 10.2 关键字 关键字:是指 JS本身已经使用了的字,不能再用它们充当变量名.方法名. 包括:break.case.catch.continue.default.delete.do.else.finally.for.function.if.in.instanceof.new.return.switch.this.throw.try.typeof.var.void.while.wi

JavaScript中typeof、toString、instanceof、constructor与in

JavaScript 是一种弱类型或者说动态语言.这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定. 这也意味着你可以使用同一个变量保存不同类型的数据. 最新的 ECMAScript 标准定义了 7 种数据类型: 7种内置类型:Boolean.Null.Undefined.Number.String.Symbol (ECMAScript 6 新定义)和Object,除 Object 以外的所有类型都是不可变的(值本身无法被改变). 一.typeof typeof操作符返回一个

Javascript 内置值、typeof运算符、true/false判断

一.内置值 true false null undefined NaN Infinity 二.typeof运算结果 number string boolean undefined function object  (array.) 三.true/false true: 字符串.true.对象 false:

C++ 三大库boost、loki、stlport

C++ 三大库boost.loki.stlport 在C++中,库的地位是非常高的.C++之父 Bjarne Stroustrup先生多次表示了设计库来扩充功能要好过设计更多的语法的言论.现实中,C++的库门类繁多,解决的问题也是极其广泛,库从轻量级到重 量级的都有.不少都是让人眼界大开,亦或是望而生叹的思维杰作.由于库的数量非常庞大,而且限于笔者水平,其中很多并不了解.所以文中所提的一些库都是比较著名的大型库. 标准库 标准库中提供了C++程序的基本设施.虽然C++标准库随着C++标准折腾了许

(一)boost库之日期、时间

(一)boost库之日期.时间 一.计时器 计时器,通常在一个项目中统计一个函数的执行时间是非常实用的. #include <boost/timer.hpp> void PrintUserTime() { boost::timer t; //定义一个计时类,开始计时 std::cout << "可度量的最大时间:" << t.elapsed_max()/3600 << "h" << std::endl; s