如果你真的需要底层元素类型,你可以使用移除类型操作特征的递归应用:
#include <type_traits>
// precv = pointer, reference, extents, const, and volatile
template <typename T>
struct remove_precv
{
typedef typename std::remove_pointer<
typename std::remove_reference<
typename std::remove_all_extents<
typename std::remove_cv<T>::type>::type>::type>::type type;
};
template <typename T, typename U>
struct element_type_impl
{
typedef typename element_type_impl<
typename remove_precv<T>::type, T>::type type;
};
template <typename T>
struct element_type_impl<T, T>
{
typedef T type;
};
template <typename T>
struct element_type
{
struct null_type { };
typedef typename element_type_impl<T, null_type>::type type;
};
例如,element_type<int***[42]>::type
是int
。