Как реализовать нечто вроде reinterpret_cast, но без необходимости указывать все спецификаторы?
Устал постоянно писать reinterpret_cast с указанием всех спецификаторов (const, volatile). Придумал шаблон.
template<typename toT, typename T>
static inline auto toType(T val) {
using t2 = typename cond<
is_const<T>,
typename cond <
log_and< is_pointer<T>, is_pointer<toT> >,
const typename remove_pointer<toT>::type *,
toT
>::type,
toT
>::type;
return reinterpret_cast< t2 >(val);
}
Как видите, получилось нечто монструозное, и это только с учётом спецификатора const. Код не по стандарту, так как всё самописное, но суть не меняет. Код работает.
Можно ли более простым способом менять интерпретацию данных?
Суть такая: допустим есть переменная типа const volatile char * A
, нужно изменить доступ с побайтового до, допустим целочисленного, то есть const volatile int * A
. Простой reinterpret_cast<int*>(A)
отбросит и const
и volatile
.
Решение на основании ответа:
template<typename TValue>
struct remove_pointer<TValue *> {
using type = TValue;
};
template<typename T>
auto toType(void* p) {
return reinterpret_cast< typename remove_pointer<T>::type *>(p);
}
template<typename T>
auto toType(const void* p) {
return reinterpret_cast<const typename remove_pointer<T>::type*>(p);
}
template<typename T>
auto toType(volatile void* p) {
return reinterpret_cast<volatile typename remove_pointer<T>::type*>(p);
}
template<typename T>
auto toType(const volatile void* p) {
return reinterpret_cast<const volatile typename remove_pointer<T>::type*>(p);
}