对于参数类C,我想总是得到“原始”类型,而不管指针,const或引用修饰符.
template<typename __T> class C { public: typedef std::some_magic_remove_all<__T>::type T; } int main() { C<some_type>::type a; }
例如,对于some_type等于:
> int&
> int **
> int *&
> int const&&
> int const * const
>依此类推
我想要一个总是类型为int的.我怎样才能实现它?
解决方法
template<class T> struct remove_all { typedef T type; }; template<class T> struct remove_all<T*> : remove_all<T> {}; template<class T> struct remove_all<T&> : remove_all<T> {}; template<class T> struct remove_all<T&&> : remove_all<T> {}; template<class T> struct remove_all<T const> : remove_all<T> {}; template<class T> struct remove_all<T volatile> : remove_all<T> {}; template<class T> struct remove_all<T const volatile> : remove_all<T> {}; //template<class T> struct remove_all<T[]> : remove_all<T> {}; //template<class T,int n> struct remove_all<T[n]> : remove_all<T> {};
我最初也剥离了范围(数组),但Johannes注意到这会导致const char []出现歧义,而问题并没有提到它们.如果我们还想剥离数组(参见注释中提到的想法),下面的内容并不会太复杂:
#include <type_traits> template<class U,class T = typename std::remove_cv<U>::type> struct remove_all { typedef T type; }; template<class U,class T> struct remove_all<U,T*> : remove_all<T> {}; template<class U,T&> : remove_all<T> {}; template<class U,T&&> : remove_all<T> {}; template<class U,T[]> : remove_all<T> {}; template<class U,class T,int n> struct remove_all<U,T[n]> : remove_all<T> {};
或者使用辅助类但只有一个模板参数:
#include <type_traits> template<class T> struct remove_all_impl { typedef T type; }; template<class T> using remove_all = remove_all_impl<typename std::remove_cv<T>::type>; template<class T> struct remove_all_impl<T*> : remove_all<T> {}; template<class T> struct remove_all_impl<T&> : remove_all<T> {}; template<class T> struct remove_all_impl<T&&> : remove_all<T> {}; template<class T> struct remove_all_impl<T[]> : remove_all<T> {}; template<class T,int n> struct remove_all_impl<T[n]> : remove_all<T> {};
如果所有变体开始寻找相同的情况是正常的;-)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。