我遇到类型有困难,例如:
T******************************************
Run Code Online (Sandbox Code Playgroud)
应该std::remove_pointer能够处理这种类型(我不这么认为)?如何删除所有*?如果&最后添加了一个或两个&符号,那么是否存在C++11标准的元函数将这种类型剥离到T不使用std::remove_reference和std::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)