VC++2013 中嵌套可变参数模板结构的别名

Alias for nested variadic templated struct in VC++2013

对于模板化的嵌套结构,我可以像下面这样定义别名:

template<typename T>struct Struct
{
    Struct(T value){}

    template<typename T1> struct Nested
    {
        Nested(T1 value){}
    };
};
template<typename T, typename T1>using NameT = struct Struct<T>::Nested<T1>;
using Name = NameT<int, double>; // Alias for a certain instance

有人可以给我提示如何为可变参数声明别名吗?

template<typename... T>struct Struct
{
    Struct(T... value){}

    template<typename T1> struct Nested
    {
        Nested(T1 value){}
    };
};
template<typename... T, typename T1>using NameT = struct Struct<T...>::Nested<T1>; // This seems ok
using Name = NameT<int, double>; // error C976: 'Name': too few template arguments

这会起作用:

template<typename T1, typename... T>using NameT = 
   typename Struct<T...>::template Nested<T1>; // This seems ok
   ^^^^^^^^               ^^^^^^^^
using Name = NameT<int, double>;

请注意参数包必须在末尾,因此定义略有更改。

LIVE DEMO

将您的代码更改为:

template<typename... T>
struct Struct
{
    Struct(T... value){}

    template<typename T1>
    struct Nested
    {
        Nested(T1 value){}
    };
};

template<typename T1, typename... T>
using NameT = typename Struct<T...>::template Nested<T1>;
using Name = NameT<int, double>;

    int main()
    {    
        Name f(1);
    }

可变参数模板必须位于模板参数列表的末尾。

#include <type_traits>
#include <tuple>
#include <utility>

template <typename... T>
struct Struct
{
    Struct(T... value) {}

    template <typename T1>
    struct Nested
    {
        Nested(T1 value) {}
    };
};

template <typename, typename>
struct split;

template <typename T, std::size_t... Is>
struct split<T, std::index_sequence<Is...>>
{
    using type = typename Struct<typename std::tuple_element<Is, T>::type...>::template Nested<typename std::tuple_element<sizeof...(Is), T>::type>;
};

template <typename... T>
using NameT = typename split<std::tuple<T...>, std::make_index_sequence<sizeof...(T)-1>>::type;

int main()
{
    static_assert(std::is_same<NameT<int, double, char>
                             , Struct<int, double>::Nested<char>>{}, "!");
}

DEMO