У меня есть несколько шаблонных классов, объявление которых выглядит так:
template <typename T, typename A, typename B, typename C>
class foo1;
template <typename T, typename A, typename B, typename C>
class foo2;
...
Я использую их в следующем контексте (каждый foo* создается с помощью A, а также B и C, с которыми был создан экземпляр bar)
:
template <typename A, typename B, typename C>
class bar {
foo1<int, A, B, C> f1;
foo2<int, A, B, C> f2;
foo2<char, A, B, C> f3;
};
Для простоты и ясности я хотел бы опустить параметры A, B и C внутри bar и просто написать:
...
foo1<int> f1;
...
Я знаю, что могу просто использовать шаблон псевдонима для всех типов foo, например:
template <typename T>
using foo1_a = foo1<T, A, B, C>;
но типов foo может быть много, и для них потребуется создать псевдонимы.
Я попытался поместить все эти псевдонимы в класс:
template <typename A, typename B, typename C>
class types {
template <typename T>
using foo1_a = foo1<T, A, B, C>;
...
};
и тогда использование выглядит так:
...
using t = types<A,B,C>;
typename t::template foo1_a<int> f1;
...
но на мой взгляд это выглядит еще хуже ...
Можно ли добиться этого другим способом?





Как насчет
template <template <typename...> class Cnt, typename T>
using bar = Cnt<T, A, B, C>;
использовал
bar<foo1, int> f1;
bar<foo2, int> f2;
bar<foo2, char> f3;
?
Если ABC поставляются только в bar для пересылки в параметры fooN, то, возможно, стоит их упаковать. Таким образом, не нужно будет обновлять подпись бара при изменении подписи fooN.
template <typename… x_FooParams>
class bar {
foo1<int, x_FooParams...> f1;
foo2<int, x_FooParams...> f2;
foo2<char, x_FooParams...> f3;
};
Я знаю, что это не "элегантно", но у вас все еще есть опция макроса #define.