c – 使用const引用删除引用

对于参数类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> {};

如果所有变体开始寻找相同的情况是正常的;-)

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...