C++編程語言可以被看做是C語言的升級版本。它不但擁有C語言的各種特性,而且還在一些特定方面上有所改進,使得開發人員在編程中大大提高了開發效率。我們在這裡會為大家詳細講解一下有關C++ typeof的應用方法。
一、基本用法。
1、C++ typeof表達式。
以下是它列出的用法:
a、取表達式的值的類型:
- template< class A, class B>
- function operator*(A a, B b) -> typeof(a*b); // return type last
- // big change: function keyword
- // : and return are obvious alternatives for ->
- template< class A, class B>
- typeof(a*b) operator* (A a, B b) ; // “lookahead parsing”
typeof(a*b)並不真的計算a*b的值,而是獲得計算的結果類型。
b、取表達式的類型:
- template< class A, class B>
- typeof(A*B) operator*(A a, B b); // use typenames
- // not general
- template< class A, class B>
- typeof((*(A*)0)*(*(B*)0)) operator*(A a, B b); // hack
目前好像只有gcc編譯器支持這個關鍵字。
2、auto關鍵字。
auto在老的語法中,是標識存儲類型的,表明此變量在本代碼塊范圍內有效,這是默認屬性,可以不寫,所以感覺有點多余。
在c++0x中,auto有了新用法,它的作用和C++ typeof相似,用法如下:
- template< class A, class B> typeof(a*b) operator*(A a, B b)
- {
- auto x = a*b; // avoid replication of expression/type
- // …
- return x;
- }
- auto glob = x*y;
看來它的作用是節省代碼的,完全可以用C++ typeof代替。
二、使用。
從上面的基本用法就知道,以往難以處理的不同類型運算問題,它都能輕松處理。
在其它場合,它也能派上用場。比如,我前段時間碰到的一個問題,比如下面一個普通類:
- struct A
- {
- int test ();
- };
在另一個類中,想要創建一個兼容A::test類型的委托(自定義的委托類):
- struct B
- {
- Delegate < int()> test;
- };
好象很容易就完成了。不過假如我的類A有10個方法,要在類B中定義10個委托呢?而且還要應對類A中可能發生的變化。於是我使用了宏來輔助產生類B:
- BEGIN_DEFINE(B) // struct B{
- METHOD(A,test) // Delegate< ...> test;
- ...
- END_DEFINE() // };
METHOD宏就是根據參數中指定的類和方法,產生委托的定義。如何得到A::test的類型?
A::test本身在C++中是個不能確定類型的東西,除非它是static,而&A::test則是一個指針值。還是那個問題,如何得到它的類型?
試圖使用traits類模板來分離類型?注意模板類在使用時必須先給出模板參數,只有模板函數可以自行推導出模板參數的類型,而函數不可能出現在類的聲明中。
好了,廢話不多說了,其實使用C++ typeof是比較簡單的實現方法:
- template < class T>
- class TypeTraits
- {
- TypeTraits (); // not implemented
- };
- //多個偏特化版本中的一個
- template < class T, class Ret>
- struct TypeTraits < Ret(T::*)() >
- {
- typedef Delegate < Ret()> type;
- };
上面的METHOD可以定義為:
- #define METHOD(T,x) TypeTraits< typeof(&T::x)>::type x;
這是目前我找到的唯一一個方法,先記錄下來。以上就是對C++ typeof的具體應用方法的介紹。