我遇到类型有困难,例如:
T******************************************
std::remove_pointer
是否应该能够处理这些类型(我不这么认为)?如何删除所有*
?如果最后添加了&符号&
或两个,那么C++11
标准是否存在将此类型删除为T
而不使用std::remove_reference
的元函数}和std::remove_pointer
元函数?
答案 0 :(得分:10)
编写一个返回基类型的元函数并不难,无论你有多少*
和&
。
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
可以处理类似的类型。它只会减少一个*
。
我刚写的小元函数最终会遇到递归深度限制。但是你可能不得不花费超过一百*
来实现这一目标。
以下是如何将它与标准库元函数结合使用以删除const和volatile限定符:
#include <type_traits>
template <typename T>
struct base_type : public ::std::remove_cv<typename remove_all_ref_ptr<T>::type> { };