尾随返回类型将 decltype 与可变参数模板函数结合使用
尝试实现累积参数并返回总和的基本加法器函数时使用适当的类型,用户遇到编译器无法推断返回类型的问题
代码片段:
template <class T, class P...> auto sum(const T& t, const P&... p) -> decltype(t + sum(p...)) { return t + sum(p...); }
使用上面的代码,当涉及两个以上参数时,编译器很难解析返回类型。为了解决这个问题,用户修改了函数声明:
template <class T, class P...> T sum(const T& t, const P&... 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&>() + val<const U&>() ), 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中文网其他相关文章!