Как создать псевдоним для типа шаблона? - PullRequest
0 голосов
/ 28 ноября 2018

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Если A B C поставляются только в bar для пересылки в параметры fooN, то, возможно, стоит их упаковать.Таким образом, не будет необходимости обновлять подпись бара, если fooN подписи изменятся.

template <typename… x_FooParams>
class bar {
    foo1<int, x_FooParams...> f1;
    foo2<int, x_FooParams...> f2;
    foo2<char, x_FooParams...> f3;
};
0 голосов
/ 28 ноября 2018

Как насчет

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;

?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...