将 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&... 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中文网其他相关文章!