Как создать псевдоним для типа шаблона?

У меня есть несколько шаблонных классов, объявление которых выглядит так:

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;
...

но на мой взгляд это выглядит еще хуже ...

Можно ли добиться этого другим способом?

Я знаю, что это не "элегантно", но у вас все еще есть опция макроса #define.

Picaud Vincent 28.11.2018 11:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
85
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как насчет

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;
};

Другие вопросы по теме