Как псевдоним вложенного шаблона с параметрическими пакетами параметров
Можно ли использовать псевдоним вложенного шаблона с ключевым словом 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;
}
Этот ответ псевдоним шаблона шаблона для вложенного шаблона? показывает способ сделать это, но это больше не будет работать, если оба пакета параметров являются переменными, поскольку компилятор не знает, с чего начать и где заканчивать списки типов.
Ответы
Ответ 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 предлагается...