将 std::tuple 的类型转换为 std::pair

Posted

技术标签:

【中文标题】将 std::tuple 的类型转换为 std::pair【英文标题】:Convert type of std::tuple to std::pair 【发布时间】:2018-01-05 11:17:23 【问题描述】:

Boost document 告诉我们如何实现类型转换器

template<class A, template<class...> class B> struct mp_rename_impl;

template<template<class...> class A, class... T, template<class...> class B>
    struct mp_rename_impl<A<T...>, B>

    using type = B<T...>;
;

template<class A, template<class...> class B>
    using mp_rename = typename mp_rename_impl<A, B>::type;

这个mp_rename的作用是将A型转换为B型。

例子:

mp_rename<std::pair<int, double>, std::tuple>

等于

std::tuple<int, double>

据我所知

mp_rename<std::pair<int, double>, std::tuple>

打电话

template<class A, template<class...> class B> struct mp_rename_impl;

然后转发到

template<template<class...> class A, class... T, template<class...> class B> struct mp_rename_impl<A<T...>, B>    

我的问题是,为什么编译器知道它应该转发给

template<template<class...> class A, class... T, template<class...> class B> struct mp_rename_impl<A<T...>, B>

并将 A 类拆分为

template<class...> class A, class... T

【问题讨论】:

【参考方案1】:
template<class A, template<class...> class B> struct mp_rename_impl;

template<template<class...> class A, class... T, template<class...> class B>
    struct mp_rename_impl<A<T...>, B>

    using type = B<T...>;
;

这里的mp_rename_impl&lt;A&lt;T...&gt;, B&gt;mp_rename_impl 结构模板的部分特化。

然后编译器使用partial ordering rules。即:

当一个类模板被实例化时,有部分 可用的专业化,编译器必须决定是否主要 将使用模板或其部分特化之一。

1) 如果只有一个特化匹配模板参数,那 使用专业化

2) 如果多个特化匹配,偏序规则是 用于确定哪个专业更专业。最多 如果它是唯一的(如果不是 唯一的,程序无法编译)

3) 如果没有匹配的特化,则使用主模板

因为你只有一个特化 mp_rename_impl&lt;A&lt;T...&gt;, B&gt; 并且它匹配模板参数然后它被编译器拾取。

编译器将A&lt;T...&gt;std::pair&lt;int, double&gt;Bstd::tuple 进行比较,并推断出相应的类型:Astd::pairBstd::tuple 和@9876543334@ 为@9876。

【讨论】:

以上是关于将 std::tuple 的类型转换为 std::pair的主要内容,如果未能解决你的问题,请参考以下文章

在std :: tuple中转换元素

将 std::vector<std::tuple<>> 转换为 torch::Tensor 的最有效方法是啥?

将 __m128i 值转换为 std::tuple

std::tuple

c++:将向量转换为元组

创建 std::promise<std::tuple<T>> 时出现错误 C2512(仅限 Visual Studio)