首页 > 后端开发 > C++ > 正文

如何使用'decltype”和可变参数模板函数来求和参数?

Mary-Kate Olsen
发布: 2024-11-13 04:48:02
原创
841 人浏览过

How to Use `decltype` with Variadic Template Functions to Sum Arguments?

将 decltype 与可变参数模板函数结合使用

当尝试使用 decltype 编写返回具有适当类型的总和的可变参数模板函数时,它可能会遇到一些意想不到的问题。

问题

最初,声明的函数没有尾随返回类型。但是,当传递多个参数时,编译器会将函数解释为未定义。使用尾随返回类型声明函数可以解决两个以上参数的问题,但会导致不同类型参数的返回类型不正确。

问题

decltype 是无法推断出两个以上参数的 t sum(p...) 的类型,因为可变参数函数模板仅在返回类型之后声明

解决方法

为了避免 decltype 中的这种递归调用,可以使用自定义特征类。 sum_type 类确定多个参数之和的类型,无需递归推导。

更新的代码

将程序中的 decltype 替换为类型名 sum_type::输入如图:

#include <iostream>
#include <type_traits>
using namespace std;

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((a b) c) 而不是 decltype(a (b c))。要获得 decltype(a (b c)) 的更精确结果,请修改最后一个特化,如下所示:

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”和可变参数模板函数来求和参数?的详细内容。更多信息请关注PHP中文网其他相关文章!

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