首页 > 后端开发 > C++ > 如何将尾随返回类型与可变参数模板函数一起使用,以推断出对不同类型的参数求和的函数的正确返回类型?

如何将尾随返回类型与可变参数模板函数一起使用,以推断出对不同类型的参数求和的函数的正确返回类型?

DDD
发布: 2024-11-15 02:26:02
原创
413 人浏览过

How can trailing return types be used with variadic template functions to deduce the correct return type for a function that sums arguments of varying types?

将 Dectype 与可变参数模板函数结合使用的尾随返回类型

尝试创建对不同类型的参数求和并返回的变分模板函数时如果输入的总和正确,则会出现常见问题。

问题公式

使用 decltype 作为尾随返回类型的基本实现会导致超过两个参数的未定义行为。为了避免这种情况,可以显式声明该函数,但这会导致多个参数的类型推导不正确。

使用自定义特征类的解决方案

要克服这些问题,使用名为 sum_type 的自定义特征类。它使用 std::add_rvalue_reference 和 std::val 递归计算返回类型。

template<class T, class... P> struct sum_type;
template<class T> struct sum_type<T> : id<T> {};
template<class T, class U, class... P> struct sum_type<T,U,P...>
: sum_type< decltype( val<const T&>() + val<const U&>() ), P... > {};
登录后复制

修改实现

通过用类型名 sum_type::输入尾随返回类型,函数可以正确推导任意数量参数的结果类型:

template <class T, class... P>
auto sum(const T& t, const P&amp;... p) -> typename sum_type<T,P...>::type
{
   return t + sum(p...);
}
登录后复制

改进的类型推导

此外,对 sum_type 的最后一个特化的修改提供了改进的类型推导:

template<class T, class U, class... P> struct sum_type<T,U,P...>
: id<decltype(
      val<T>()
    + val<typename sum_type<U,P...>::type>()
)>{};
登录后复制

这确保返回类型与 decltype(a (b c)) 匹配,与预期的加法顺序对齐。

以上是如何将尾随返回类型与可变参数模板函数一起使用,以推断出对不同类型的参数求和的函数的正确返回类型?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板