4

基本構造:

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. 

これを回避する方法は?

4

2 に答える 2

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;
};
于 2012-08-29T06:11:44.450 に答える
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;
};
于 2012-08-29T06:18:05.153 に答える