递归std :: remove_pointer?

时间:2013-02-19 07:18:32

标签: c++ c++11

我遇到类型有困难,例如:

T******************************************

std::remove_pointer是否应该能够处理这些类型(我不这么认为)?如何删除所有*?如果最后添加了&符号&或两个,那么C++11标准是否存在将此类型删除为T而不使用std::remove_reference的元函数}和std::remove_pointer元函数?

1 个答案:

答案 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> { };