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)))
(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
};
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;
};
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;
};
};
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.