我对类型有困难,例如:
T******************************************
应该std::remove_pointer
能够处理这些类型(我不这么认为)?怎么全部去掉*
?如果&
最后添加了一个或两个&符号,是否存在C++11
标准中的元函数来将这种类型剥离到T
不使用 thestd::remove_reference
和std::remove_pointer
元函数?
*
编写一个无论你有多少s 和s都会返回基类型的元函数并不难&
。
template <typename T>
struct remove_all_ref_ptr { typedef T type; };
template <typename T>
struct remove_all_ref_ptr<T *> : public remove_all_ref_ptr<T> { };
template <typename T>
struct remove_all_ref_ptr<T * const> : public remove_all_ref_ptr<T> { };
template <typename T>
struct remove_all_ref_ptr<T * volatile> : public remove_all_ref_ptr<T> { };
template <typename T>
struct remove_all_ref_ptr<T * const volatile> : public remove_all_ref_ptr<T> { };
template <typename T>
struct remove_all_ref_ptr<T &> : public remove_all_ref_ptr<T> { };
template <typename T>
struct remove_all_ref_ptr<T &&> : public remove_all_ref_ptr<T> { };
并且::std::remove_pointer
可以很好地处理这样的类型。它只是砍掉一个*
.
我刚刚写的那个小元函数最终会遇到递归深度限制。但是你可能需要穿上一百多个*
s 才能做到这一点。
以下是您可以如何将它与标准库元函数一起使用以删除 const 和 volatile 限定符:
#include <type_traits>
template <typename T>
struct base_type : public ::std::remove_cv<typename remove_all_ref_ptr<T>::type> { };