c++是一門靜態編譯語言,不支援動態型別的獲取,但在實際情況中,經常會遇到資料型別的判斷。什麼是型別識別?其實就是rtti,執行時型別識別,也就是得到資料的實際定義型別。
那麼在c++中簡單的獲取型別有幾種方法:
在《c++程式設計思想》第8章「執行時型別識別」中提到了三種基本方法:
1、手動控制(多型機制)
即通過多型機制,利用特定的標記來標識型別。
2、typeid
庫本身提供的乙個介面:
struct test;
unsigned int uint_ = 4;
assert(typeid(unsigned int).name() == typeid(uint_).name());
const char * info = typeid(new test()).name();
std::cout <
在linux c語言中提供typeof 這個擴充套件關鍵字,實現了類似的功能,但更強大一些。
3、dynamic_cast
這個是用來識別和判斷父子類的。前面講過多次,這裡不再贅述。
三、型別的自動推導
c++的型別推導和獲取,又有幾種方法:
1、c++11中的auto和decltype
這兩個關鍵提供了進一步的型別操作:
auto a = 10;
auto b = &a;
decltype適合於表示式或者返回值中對型別的推導判斷:
int gettype()
decltype(gettype()) aaa = 100;
2、模板的自動推導
下面再專門分析。
上面的幾種方式都可以達到一定的型別處理的目的,但都有著這樣或者那樣的限制,不過矬子裡面拔將軍,模板推導還是比較強大的。在分析模板推導前,看看其實語言實現有多麼的簡單方便,就會明白為什麼c++的學習大家都喊難。
相比於其它其它型別語言如c#,它們如何獲取和生成物件呢?看乙個例子:
//反射例程:
public class rtest
......
}type type = typeof(rtest);
rtest rt = new rtest();
type t = rt.gettype();
rtest rrt = (rtest)activator.createinstance(type);
templatevoid algocontrol( t t,n n)
algocontrol(1, 100);
algocontrol(2,6);
上面對模板函式algocontrol的呼叫有兩種情況,第二種就是上面的推導機制的說明,在並沒有顯示宣告模板引數型別時,編譯器可以根據傳入的2,6自動推導t,n的實際型別。這個例子可能不太形象,再看乙個侯捷《stl原始碼剖析》中的例子:
templatevoid func_impl(iterator iter, t t)
templatevoid func(iterator iter)
int test( )
是不是覺得挺強大?但是,它是受限制使用的,在下面的情況中無法使用:
1、無法推導返回值
templatet algocontrol( n n)
int d = algocontrol(6);
2、模板引數和實際傳入引數沒關係無法推導
templateint algocontrol( int a,int b)
int d = algocontrol(1,6);
3、模板引數和實際傳入引數位置不對應無法推導
templateint algocontrol3(t a, s s)
int a = algocontrol3 (1,3);//第乙個引數沒有傳實際引數
自動型別推導
c 03及之前的標準種,auto放在變數宣告之前,宣告變數為自動變數 還有一種為靜態變數 static變數 的儲存策略。但是這個關鍵字常省略不寫。c 11中,auto關鍵字放在變數之前,作用是在宣告變數的時候根據變數初始值的型別自動為此變數選擇匹配的型別。注意點 auto a1 10 正確 auto...
C 11 14 自動型別推導 auto
從c 11起,auto關鍵字不再表示儲存型別,而是成為了隱式型別定義關鍵字,其作用是讓編譯器在編譯期 便自動推斷出變數的型別。例如 auto a 1 a 為 int 型變數 auto ptr new auto 1 auto 1 int 1 ptr 為 int 型指標變數 const auto q a...
C 11 auto自動型別推導
1.auto型別推導auto x 5 正確,x是int型別 auto pi new auto 1 正確,批是int const auto v x,u 6 正確,v是const int 型別,u是const int static auto y 0.0 正確,y是double型別 auto int r ...