即使T是指针,也可以访问模板参数T的嵌套类型

时间:2012-08-29 06:08:21

标签: c++ templates pointers

基础结构:

struct Foo{
    typedef int inner_type;
};

template<class T>
struct Bar{
    typename T::inner_type x;
};

主要:

Bar<Foo>();  // Compiles OK
Bar<Foo*>(); // Doesn't compile: template T becomes a pointer-to-class and is not a valid class anymore. 

如何解决这个问题?

2 个答案:

答案 0 :(得分:8)

Bar结构专门用于指向T类型的指针:

//non-specialized template for generic type T
template<class T>
struct Bar{
    typename T::inner_type x;
};

//specialization for pointer-to-T types
template<class T>
struct Bar<T*>{
    typename T::inner_type x;
};

答案 1 :(得分:7)

如果您需要在专门化模板很困难的情况下执行此操作,您还可以使用某些适当的模板计算要使用的类型:

template<class T> struct remove_all_pointers {
    typedef T type;
};
template<class T> struct remove_all_pointers<T*> {
    typedef typename remove_all_pointers<T>::type type;
};
template<class T> struct remove_all_pointers<T* const> {
    typedef typename remove_all_pointers<T>::type type;
};
template<class T> struct remove_all_pointers<T* volatile> {
    typedef typename remove_all_pointers<T>::type type;
};
template<class T> struct remove_all_pointers<T* const volatile> {
    typedef typename remove_all_pointers<T>::type type;
};

struct Foo {
    typedef int inner_type;
};

template<class T>
struct Bar {
    typename remove_all_pointers<T>::type::inner_type x;
};