Подтвердить что ты не робот

Как псевдоним вложенного шаблона с параметрическими пакетами параметров

Можно ли использовать псевдоним вложенного шаблона с ключевым словом using? Что-то вроде этого

template <typename... Types>
struct Something {
    template <typename... TypesTwo>
    struct Another {};
};

template <typename... Types>
template <typename... TypesTwo>
using Something_t = typename Something<Types...>::template Another<TypesTwo...>;

int main() {
    Something_t<int><double>{};
    return 0;
}

Этот ответ псевдоним шаблона шаблона для вложенного шаблона? показывает способ сделать это, но это больше не будет работать, если оба пакета параметров являются переменными, поскольку компилятор не знает, с чего начать и где заканчивать списки типов.

4b9b3361

Ответ 1

Не совсем то, что вы просили, но... если вы можете обернуть списки вариационного типа в качестве аргументов кортежей (или подобных классов)...

#include <tuple>

template <typename ... Types>
struct Something
 {
   template <typename ... TypesTwo>
   struct Another {};
 };

template <typename, typename>
struct variadicWrapper;

template <typename ... Ts1, typename ... Ts2>
struct variadicWrapper<std::tuple<Ts1...>, std::tuple<Ts2...>>
 { using type = typename Something<Ts1...>::template Another<Ts2...>; };

template <typename T1, typename T2>
using Something_t = typename variadicWrapper<T1, T2>::type;

int main()
 {
   Something_t<std::tuple<int>, std::tuple<double>>{};
 }

Ответ 2

Не автономный ответ, но дополнение к max66 ответ:

Вы могли бы попробовать следующее:

template<typename ... TT, typename ... TTT>
using Alias = typename Something<TT...>::Another<TTT...>;

Сначала выглядит действительно приятно, не так ли?

Проблема тогда, однако, уже будет с одним единственным параметром шаблона:

Alias<int> a;

Какой из них сейчас? Something<int>::Another<> или Something<>::Another<int>? И если у вас есть больше параметров, как распределить? Нет шансов получить содержательное решение. Так что нет, вы не можете сделать это напрямую, вам нужно помочь себе с помощью трюков, таких как max66 предлагается...