如何使用可变参数包为嵌套模板类设置别名

时间:2017-03-15 16:05:55

标签: c++ c++11 templates c++14 variadic-templates

有没有办法可以使用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;
}

这个答案template template alias to a nested template?显示了一种方法,但如果两个参数包都是可变参数,那么它将不再有效,因为编译器不知道从哪里开始以及在何处结束类型列表。

2 个答案:

答案 0 :(得分:2)

不完全是你问的但是...如果你可以将你的可变参数类型列表包装为元组(或类似类)的参数......

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

答案 1 :(得分:0)

不是一个独立的答案,而是对max66答案的补充:

你可以尝试这个:

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

起初看起来真的很好,不是吗?

然而问题是,已经有一个模板参数:

Alias<int> a;

现在是哪一个? Something<int>::Another<>Something<>::Another<int>?如果您有更多参数,如何分发?没有机会获得有意义的解决方案。所以不,你不能直接做到这一点,你必须帮助自己如max66提出的技巧......