1. 程式人生 > >C++ 如何從指標中得到型別或引用

C++ 如何從指標中得到型別或引用

C++標準語法中我們可以通過  * 來定義指標 &來指定引用

如 typedef int * _INT_PTR;

我們定義了一個指標

typedef int& _INT_REF;

我們定義了一個引用

那我們有沒辦法通過一個已知的指標或引用來定義一個原始型別呢?

typedef *_INT_PTR  _INT?

這似乎不符合語法。

那你可能會問這麼奇怪的需求有存在的需要嗎?

當你操作別人的資料時,對方由於一些原因只給你提供了指標型別(如後本人所碰到的),你就有可能有這樣的需求。

這樣的需求有現成的方案嗎?

你當然可以使用auto來定義,或decltype來萃取,不過當你需要用來作為型別進行計算或者其它用途時可能會顯的比較麻煩,當然auto你還需要啟用x11支援。

本人是為了使一個以前寫的通用容器支援linux,用到了iterator::_Base_ptr及iterator::_Link_type 而二者均為指標,在計算地址時雖然可重寫CONTAINING_RECORD來實現,不過為了可能以後會用到想到了用偏特化寫一個專門得到型別定義的方法

在此之前也分享一下其它的一些使用過的方法

1.計算指標指向物件的大小 sizeof( *((Ptr)NULL) )

2.

#define CONTAINING_RECORD_PTR(address, typePtr, field) ((typePtr)( \
 (char*)(address) - \
 (unsigned long long)(&((typePtr)0)->field))) 最後就是直接得到型別 namespace point_reference_help{
enum POINT_REFERENCE{
 POINT_REFERENCE_TYPE=0,
 POINT_REFERENCE_POINT,
 POINT_REFERENCE_REF
}; template<class T,int Type>
struct get_type{
 typedef T* pointer;
 typedef T& reference;
 typedef T type;
}; template<class T>
struct get_type<T*,1>{
 typedef T* pointer;
 typedef T& reference;
 typedef T type;
};
template<class T>
struct get_type<T&,2>{
 typedef T* pointer;
 typedef T& reference;
 typedef T type;
};
};
使用上非常簡單 如: typedef int* _INT_PTR; point_reference_help::get<_INT_PTR,point_reference_help::POINT_REFERENCE_POINT>::type val_int=5; 當然我碰到的問題就更簡單了 typedef typename point_reference_help::get_type<_Link_type,point_reference_help::POINT_REFERENCE_POINT>::type _Link_Body; 可以繼續使用 _Link_type ptr = CONTAINING_RECORD(val,_Link_Body,_M_value_field); 此方法在支援偏特化的編譯器上應該都被支援,實測 gcc及vs.