1. 程式人生 > >C++ typeof基本應用方式解析

C++ typeof基本應用方式解析

C++程式語言可以被看做是C語言的升級版本。它不但擁有C語言的各種特性,而且還在一些特定方面上有所改進,使得開發人員在程式設計中大大提高了開發效率。我們在這裡會為大家詳細講解一下有關C++ typeof的應用方法。

一、基本用法。

1、C++ typeof表示式。

以下是它列出的用法:

a、取表示式的值的型別:

  1. template<class A, class B>
  2. function operator*(A a, B b) -> typeof(a*b); // return type last  
  3. // big change: function keyword  
  4. // : and return are obvious alternatives for -
    >
  5. template<class A, class B>
  6. typeof(a*b) operator* (A a, B b) ; // “lookahead parsing” 

typeof(a*b)並不真的計算a*b的值,而是獲得計算的結果型別。

b、取表示式的型別:

  1. template<class A, class B>
  2. typeof(A*B) operator*(A a, B b); // use typenames  
  3. // not general  
  4. template<class A, class B>
  5. typeof((*(A*)0)*(*(B*)0)) operator*(A a, B b); // hack 

目前好像只有gcc編譯器支援這個關鍵字。

2、auto關鍵字。

auto在老的語法中,是標識儲存型別的,表明此變數在本程式碼塊範圍內有效,這是預設屬性,可以不寫,所以感覺有點多餘。

在c++0x中,auto有了新用法,它的作用和C++ typeof相似,用法如下:

  1. template<class A, class B> typeof(a*b) operator*(A a, B b)  
  2. {  
  3. auto x = a*b; // avoid replication of expression/type  
  4. // …  
  5. return x;  
  6. }  
  7. auto glob = x*y; 

看來它的作用是節省程式碼的,完全可以用C++ typeof代替。

二、使用。

從上面的基本用法就知道,以往難以處理的不同型別運算問題,它都能輕鬆處理。

在其它場合,它也能派上用場。比如,我前段時間碰到的一個問題,比如下面一個普通類:

  1. struct A  
  2. {  
  3. int test ();  
  4. }; 

在另一個類中,想要建立一個相容A::test型別的委託(自定義的委託類):

  1. struct B  
  2. {  
  3. Delegate <int()> test;  
  4. }; 

好象很容易就完成了。不過假如我的類A有10個方法,要在類B中定義10個委託呢?而且還要應對類A中可能發生的變化。於是我使用了巨集來輔助產生類B:

  1. BEGIN_DEFINE(B) // struct B{  
  2. METHOD(A,test) // Delegate<...> test;  
  3. ...  
  4. END_DEFINE() // }; 

METHOD巨集就是根據引數中指定的類和方法,產生委託的定義。如何得到A::test的型別?

A::test本身在C++中是個不能確定型別的東西,除非它是static,而&A::test則是一個指標值。還是那個問題,如何得到它的型別?

試圖使用traits類模板來分離型別?注意模板類在使用時必須先給出模板引數,只有模板函式可以自行推匯出模板引數的型別,而函式不可能出現在類的宣告中。

好了,廢話不多說了,其實使用C++ typeof是比較簡單的實現方法:

  1. template <class T>
  2. class TypeTraits  
  3. {  
  4. TypeTraits (); // not implemented  
  5. };  
  6. //多個偏特化版本中的一個  
  7. template <class T, class Ret>
  8. struct TypeTraits <Ret(T::*)() >
  9. {  
  10. typedef Delegate <Ret()> type;  
  11. }; 

上面的METHOD可以定義為:

  1. #define METHOD(T,x) TypeTraits<typeof(&T::x)>::type x; 

這是目前我找到的唯一一個方法,先記錄下來。以上就是對C++ typeof的具體應用方法的介紹。