厌倦了不断地编写reinterpret_cast来指定所有说明符(const、易失性)。想出了一个模板。
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);
}