template<class From>
typename copy_rpcv<void, From*>::type void_cast(From *p) {
return p; // implicit conversion works
}
С небольшой утилитой TMP :
// "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; };
Вы должны добавить еще один случай для спецификатора restrict; это, вероятно, будет работать просто отлично, но я не знаю, как это, как нестандартная функция в 03 (это в 0x?), взаимодействует:
template<class To, class From> struct copy_rpcv<To, From* restrict> { typedef typename copy_rpcv<To, From>::type* restrict type; };
Мое решение отличается от Энтони в сохранении информации «вложенного» типа:
int *const *const p = 0;
void *const *const v = void_cast(p);