1. 程式人生 > >boost--BOOST_AUTO、typeof、result_of

boost--BOOST_AUTO、typeof、result_of

== 關鍵字 一個 指針 我們 現在 ecc 根據 div

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; }
View Code

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
View Code

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;
}
View Code

②、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
View Code

③、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;
}
View Code

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;
}
View Code

②、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;
}
View Code

③、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;
}
View Code

boost--BOOST_AUTO、typeof、result_of