Per*_*-lk 10 c++ templates std c++11
对于参数类C,我想总是得到"原始"类型,而不管指针,const或引用修饰符.
template<typename __T>
class C
{
public:
typedef std::some_magic_remove_all<__T>::type T;
}
int main()
{
C<some_type>::type a;
}
Run Code Online (Sandbox Code Playgroud)
例如,some_type等于:
int&int**int*&int const &&int const * const我想要a的永远是类型int.我怎样才能实现它?
Mar*_*sse 12
如果您想更多地使用标准库,您可以:
#include <type_traits>
template<class T, class U=
typename std::remove_cv<
typename std::remove_pointer<
typename std::remove_reference<
typename std::remove_extent<
T
>::type
>::type
>::type
>::type
> struct remove_all : remove_all<U> {};
template<class T> struct remove_all<T, T> { typedef T type; };
Run Code Online (Sandbox Code Playgroud)
删除的东西,直到不再改变类型.
Mar*_*sse 11
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> {};
Run Code Online (Sandbox Code Playgroud)
我最初也剥离了范围(数组),但约翰尼斯注意到这会引起歧义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, class T> struct remove_all<U,T&> : remove_all<T> {};
template<class U, class T> struct remove_all<U,T&&> : remove_all<T> {};
template<class U, class T> struct remove_all<U,T[]> : remove_all<T> {};
template<class U, class T, int n> struct remove_all<U,T[n]> : remove_all<T> {};
Run Code Online (Sandbox Code Playgroud)
或者使用辅助类但只有一个模板参数:
#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> {};
Run Code Online (Sandbox Code Playgroud)
如果所有变体开始寻找相同的情况是正常的;-)