#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 не могли бы вы немного подробнее остановиться на этом?