Search code examples
c++templatestemplate-templatesnon-type-template-parameter

If template parameter AA is a templatized class A<T> itself, is it possible to get the template parameter (T) of this templatized class?


Consider the code below:

template <typename T>
class A{
...
}

template <class U>
class B{
...
}

int main {
B<A<int>> a;
...
}

How can I get the template parameter of A (int in this case) inside B, if A<int> is the template parameter for B? I could parametrize B as follows, but I feel like I am sending an unnecessary piece of information.

template <class AA, typename T>
class B { ... }

The reason I do not simply use template <typename T> for class B is that I have a pointer to class A inside B, and I want to use the template parameter class AA to see if that pointer is const or not, hence have the correct type for the member pointer in B.


Solution

  • There are several ways, depending of that you might change:

    • Quick way, specialize B

      template <class> class B;
      
      template <class T>
      class B<A<T>>
      {
          // Use directly T
          //...
      };
      
    • Add info in A directly (as std containers do with value_type)

      template <typename T>
      struct A
      {
          using my_type = T;
      };
      
      // Then in `B<U>`, use `typename U::my_type`
      
    • Use external traits to extract information from A (as std::iterator_traits) (that also allows to handle built-in types):

      template <typename T>
      struct ATrait;
      
      template <typename T>
      struct ATrait<A<T>>
      {
          using my_type = T;
      };
      
      // Possibly a generic one
      template <template <typename> class C, typename T>
      struct ATrait<C<T>>
      {
          using my_type = T;
      };
      
      // Then in `B<U>`, use `typename ATrait<U>::my_type`