【问题标题】:Alias for nested variadic templated struct in VC++2013VC++2013 中嵌套可变参数模板结构的别名
【发布时间】:2015-10-21 08:16:43
【问题描述】:

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

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

【问题讨论】:

  • 不确定this is what you want;如果您使用例如编译铿锵声你会得到更多的描述性错误消息(例如template parameter pack must be the last template parameter
  • @m.s.使用您的链接(clang),例如它告诉我的 C++14 设置,找不到用于初始化 'Name'(又名 'Struct::Nested')的匹配构造函数,但参数错误(应该是 Struct::Nested),所以我不确定是否所有编译器都可以处理上面的这段代码......

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


【解决方案1】:

这将起作用:

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

请注意,参数包必须放在末尾,因此定义会稍作更改。

LIVE DEMO

【讨论】:

  • 不适用于 VC++12:错误 C3860:类模板名称后面的模板参数列表必须按照模板参数列表中使用的顺序列出参数 - 还有其他建议吗?
  • 有趣的是,它在 VC++13 和 VC++15 以及 gcc 和 clang test code 中都适用于我。
  • 啊,这是我的代码中缺少的神奇 ::template 关键字。非常感谢
【解决方案2】:

将您的代码更改为:

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);
    }

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

【讨论】:

    【解决方案3】:
    #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

    【讨论】:

    • 这是 VC++2013 代码吗?因为我收到错误 C2039: 'index_sequence' : is not a member of 'std'
    猜你喜欢
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    相关资源
    最近更新 更多