Mossid
Mossid

Reputation: 183

Deduce template parameter's template parameter

There is a class template A, which is taking template class for its template parameter.

template <typename T> class A {}
template <typename T> class B {}
int main()
{
    A<B<int>>();
    return 0;
}

Can class template A deduces its template parameter(B int)'s template parameter(int)?

Or is there the other way to solve this problem? For example,

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

Upvotes: 2

Views: 1321

Answers (3)

Yakk - Adam Nevraumont
Yakk - Adam Nevraumont

Reputation: 275878

template<class>struct inner{};
template<template<class...>class Z, class T, class...Ts>
struct inner<Z<T, Ts...>>{
  using type=T;
};
template<class Z>
using inner_t=typename inner<Z>::type;

and inner_t<X> is the first template argument of X if it exists, and a substitution failure otherwise.

Upvotes: 5

TartanLlama
TartanLlama

Reputation: 65770

You can make A a template template:

template <template <typename> class T, typename Inner> 
class A<T<Inner>> {};

Upvotes: 5

swang
swang

Reputation: 5249

What you described is a template template:

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

note the class before T has to be class, not typename.

Upvotes: 1

Related Questions