template<class From>
typename copy_rpcv<void, From*>::type void_cast(From *p) {
return p; // implicit conversion works
}
带一点TMP utility:
// "copy ref/pointer/const/volatile"
template<class To, class From>
struct copy_rpcv {
typedef To type;
};
template<class To, class From> struct copy_rpcv<To, From& > { typedef typename copy_rpcv<To, From>::type& type; };
template<class To, class From> struct copy_rpcv<To, From* > { typedef typename copy_rpcv<To, From>::type* type; };
template<class To, class From> struct copy_rpcv<To, From const > { typedef typename copy_rpcv<To, From>::type const type; };
template<class To, class From> struct copy_rpcv<To, From volatile> { typedef typename copy_rpcv<To, From>::type volatile type; };
您必须为限制说明符添加另一种情况;它可能会工作得很好,但我不知道它作为 03 中的非标准功能(是在 0x 中吗?)如何交互:
template<class To, class From> struct copy_rpcv<To, From* restrict> { typedef typename copy_rpcv<To, From>::type* restrict type; };
我的解决方案与 Anthony's 的不同之处在于保留“嵌套”类型信息:
int *const *const p = 0;
void *const *const v = void_cast(p);