将 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<A<T...>, B>
是mp_rename_impl
结构模板的部分特化。
然后编译器使用partial ordering rules。即:
当一个类模板被实例化时,有部分 可用的专业化,编译器必须决定是否主要 将使用模板或其部分特化之一。
1) 如果只有一个特化匹配模板参数,那 使用专业化
2) 如果多个特化匹配,偏序规则是 用于确定哪个专业更专业。最多 如果它是唯一的(如果不是 唯一的,程序无法编译)
3) 如果没有匹配的特化,则使用主模板
因为你只有一个特化 mp_rename_impl<A<T...>, B>
并且它匹配模板参数然后它被编译器拾取。
编译器将A<T...>
与std::pair<int, double>
和B
与std::tuple
进行比较,并推断出相应的类型:A
为std::pair
,B
为std::tuple
和@9876543334@ 为@9876。
【讨论】:
以上是关于将 std::tuple 的类型转换为 std::pair的主要内容,如果未能解决你的问题,请参考以下文章
将 std::vector<std::tuple<>> 转换为 torch::Tensor 的最有效方法是啥?
创建 std::promise<std::tuple<T>> 时出现错误 C2512(仅限 Visual Studio)