首页  >  文章  >  后端开发  >  如何使用尾随返回类型和'decltype”确保使用可变参数模板函数正确的返回类型推导?

如何使用尾随返回类型和'decltype”确保使用可变参数模板函数正确的返回类型推导?

Susan Sarandon
Susan Sarandon原创
2024-11-13 06:09:02319浏览

How can I ensure correct return type deduction with a variadic template function using trailing return type and `decltype`?

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

尝试实现累积参数并返回总和的基本加法器函数时使用适当的类型,用户遇到编译器无法推断返回类型的问题

代码片段:

template <class T, class P...>
auto sum(const T&amp; t, const P&amp;... p) -> decltype(t + sum(p...))
{
   return t + sum(p...);
}

使用上面的代码,当涉及两个以上参数时,编译器很难解析返回类型。为了解决这个问题,用户修改了函数声明:

template <class T, class P...>
T sum(const T&amp; t, const P&amp;... p);

此修改解决了问题,但引入了另一个问题:函数为混合类型参数返回了一个整数,这是不希望的。

讨论和解决:

问题的出现是因为使用 decltype 的尾随返回类型仅被认为是在返回类型已指定。然而,在这种情况下,返回类型取决于对 sum 的递归调用。

为了解决这个问题,引入了一个自定义特征类:

template<class T> typename std::add_rvalue_reference<T>::type val();

template<class T> struct id{typedef T type;};

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&amp;>() + val<const U&amp;>() ), P... > {};

通过将 decltype 替换为类型名 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>()
)>{};

T,P...>::type,问题已解决。或者,用户可以修改 sum_type 类的最后一个特化,以确保运算符的正确关联:

通过这些修改,加法器函数可以准确地累积参数并返回具有正确类型的预期总和。

以上是如何使用尾随返回类型和'decltype”确保使用可变参数模板函数正确的返回类型推导?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn