Инициализировать шаблонный класс с различными параметрами шаблона

#c #templates #alias

#c #шаблоны #псевдоним

Вопрос:

Я пытаюсь создать тот же класс из шаблона класса с разными параметрами шаблона.

Допустим, я создаю пользовательский тип A , который создается с помощью шаблона класса

 typename <int i1, int i2>
class A { };
 

теперь у меня есть шаблон второго класса B , который принимает a A<x,y> в качестве параметра шаблона

 template <typename A_T>
class B { };
 

Я мог бы определить шаблон псевдонима, чтобы также разрешить

 template <int i1, int i2>
using BD = B<A<i1, i2>>;
 

Мой вопрос в том, есть ли какой-либо способ спроектировать это так, чтобы имя шаблона было одинаковым для пользователя в проблемных случаях? Т.е. так, чтобы пользователь мог сделать

 typedef A<1,2> A_t;
B<A_t> b1;

B<1,2> b2; // Rather than BD<1,2>;
 

Любая помощь приветствуется.

Комментарии:

1. B<a> не будет компилироваться. Вы бы хотели B<decltype(a)> b1; B , чтобы объекты также могли быть записаны так, чтобы быть B<A<1, 2>> , если шаблон есть template <typename T>class B{}; , разве этого недостаточно? Я недостаточно разбираюсь в шаблонах и, в частности, в SFINAE, чтобы точно знать, возможно ли то, что вы хотите, или нет. Я склоняюсь к тому, что это не так.

2. Спасибо за ваш ответ. Отредактировал вопрос, чтобы исправить эту часть.

3. B<A<1, 2>> b1; B<1, 2> b2; это невозможно, но auto b1 = makeB<A<1, 2>>(); auto b2 = makeB<1, 2>(); static_assert(std::is_same_v<decltype(b1), decltype(b2)>); возможно.

4. Если вы хотите B , чтобы экземпляр создавался только с A<int, int> помощью , вы должны объявить, но не определять B , а затем специализировать его для принятия A<int, int>

5. @Fareanor не могли бы вы немного подробнее остановиться на этом?