将 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&>() + val<const U&>() ), 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中文网其他相关文章!