Самый простой способ, о котором уже упоминали другие, - это добавить статический член к Basewrapper
, который инициализируется в N
.
Однако, если по какой-то причине вы не можете изменить User
, есть также способ получить N:
template<typename T> struct get_N;
template<unsigned int N> struct get_N<Basewrapper<N> > { unsigned int const value = N; };
Теперь в вашем шаблоне User
вы можете просто написать get_N<T>::value
.
Одним из преимуществ этого является то, что вы можете адаптироватьлюбой тип после факта, не касаясь его определения, поэтому, если вы когда-либо захотите создать экземпляр User
для чего-либо, кроме Basewrapper
, скажем, для Newbasewrapper
, вы просто добавляете строку
template<unsigned int N> struct get_N<Newbasewrapper<N> > { unsigned int const value = N; };
илиесли Newbasewrapper принимает какой-либо тип в качестве аргумента шаблона и предоставляет значение N в качестве статического члена const,
template<typename T> struct get_N<Basewrapper<T> > { unsigned int const value = Basewrapper<T>::N; };