递归std :: remove_pointer?

use*_*108 1 c++ c++11

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

T******************************************
Run Code Online (Sandbox Code Playgroud)

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

Omn*_*ous 10

编写一个返回基类型的元函数并不难,无论你有多少*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> { };
Run Code Online (Sandbox Code Playgroud)

并且::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> { };
Run Code Online (Sandbox Code Playgroud)

  • `typedef`不应该是`public`还是``````````````````````````````` (2认同)