C++ VC+;中嵌套可变模板结构的别名+;2013

C++ VC+;中嵌套可变模板结构的别名+;2013,c++,c++11,templates,variadic-templates,C++,C++11,Templates,Variadic Templates,对于模板嵌套结构,我可以定义如下别名: 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>:

对于模板嵌套结构,我可以定义如下别名:

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
templatestruct结构
{
结构(T值){}
模板结构嵌套
{
嵌套(T1值){}
};
};
templateusing NameT=struct struct::Nested;
使用Name=NameT;//某个实例的别名
有人能给我一个提示,如何为可变变量声明别名吗

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
templatestruct结构
{
结构(T…值){}
模板结构嵌套
{
嵌套(T1值){}
};
};
templateusing NameT=struct struct::Nested;//这似乎还可以
使用Name=NameT;//错误C976:“名称”:模板参数太少
这将起作用:

template<typename T1, typename... T>using NameT = 
   typename Struct<T...>::template Nested<T1>; // This seems ok
   ^^^^^^^^               ^^^^^^^^
using Name = NameT<int, double>;
templateusing NameT=
typename结构::模板嵌套;//这似乎还可以
^^^^^^^^               ^^^^^^^^
使用Name=NameT;
请注意,参数包必须位于末尾,因此定义略有更改

将代码更改为:

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);
    }
模板
结构
{
结构(T…值){}
模板
嵌套结构
{
嵌套(T1值){}
};
};
模板
使用NameT=typename Struct::template嵌套;
使用Name=NameT;
int main()
{    
名称f(1);
}
可变模板必须位于模板参数列表的末尾。

\include
#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>>{}, "!");
}
#包括 #包括 模板 结构 { 结构(T…值){} 模板 嵌套结构 { 嵌套(T1值){} }; }; 模板 结构拆分; 模板 结构拆分 { 使用type=typename Struct::template嵌套; }; 模板 使用NameT=typename split::type; int main() { 静态断言(std::is_same{},“!”); }

不确定是否;如果使用例如clang编译,您将获得更多描述性错误消息(例如,
模板参数包必须是最后一个模板参数
)@m.s。使用链接(clang)和例如C++14设置,它告诉我,找不到用于初始化“Name”(又名“Struct::Nested”)的匹配构造函数,但是参数是错误的(应该是Struct::Nested),所以我不确定是否所有的编译器都能处理上面的代码…不适用于VC++12:错误C3860:类模板名称后面的模板参数列表必须按照模板参数列表中使用的顺序列出参数-还有其他建议吗?有趣的是,它在VC++13和VC++15以及gcc和clang中都适用,我的代码中缺少magic::template关键字。谢谢,这是VC++2013的代码吗?原因我得到错误C2039:“index_sequence”:不是“std”的成员