Инициализируйте кортеж с шаблоном класса для каждого типа шаблона - PullRequest
0 голосов
/ 06 октября 2019

Название, вероятно, трудно разобрать, поэтому вот что я имею в виду. Допустим, у меня есть несколько классов A, B1, B2, B3 ... Bn, где я хотел бы держать кортеж шаблонов A на каком-то классе B. Действительный конечный результат может быть что-то вроде tuple<A<B3>, A<B1>> _chain. Это будет содержаться в контейнере класса, который мы будем называть C. То, что я ищу, - это инициализация C с помощью набора типов B, которые затем включаются в мой класс A. Я не могу просто сделать

template<class... T>
class C
{
    std::tuple<T...> _chain;
public:
    C(const T&... t) : _chain(t...) { }
};

, потому что тогда я получу кортеж Bs. Есть ли эргономичный способ обернуть шаг инициализации (_chain(t...)), чтобы в итоге я получил набор из шаблонов A для шаблонов B, которые я передаю классу?

1 Ответ

3 голосов
/ 06 октября 2019

Вы имеете в виду что-то вроде этого:

template<template <typename> typename Base, class... T>
class C
{
    std::tuple<Base<T>...> _chain;
public:
    C(const Base<T>&... t) : _chain(t...) { }
};

Вы можете использовать это так: C<A, B1, B2, B3> c;

_chain будет тогда кортежем tuple<A<B1>, A<B2>, A<B3>>.

...