变分函数-确定返回类型
Variadic function - determining return type
我在玩可变模板,我被以下内容卡住了:
template <class T1, class T2>
auto sum(T1 a, T2 b) ->decltype(a + b){
return a + b;
}
template <class T1, class T2, class... T3>
auto sum(T1 a, T2 b, T3... tail) ->decltype(a + b){
return a + sum(b, tail...);
}
函数调用:
cout << sum(1, 2, 3, 4) << endl; // 10 - OK
cout << sum(1.5, 2, 3, 4) << endl; // 10.5 - OK
cout << sum(1, 2, 3.5, 4) << endl; // 10 !! wrong result
我在这里做错了什么?
sum(1, 2, 3.5, 4)
前两个参数的类型为int
。因此,在尾部返回类型中,decltype(a + b)
是int
,因此结果被转换为int
-并被截断。
使用std::common_type
:
template <class T1, class T2, class... T3>
typename std::common_type<T1, T2, T3...>::type
sum(T1 a, T2 b, T3... tail)
{
return a + sum(b, tail...);
}
注意
template <class T1, class T2, class... T3>
auto sum(T1 a, T2 b, T3... tail) ->decltype(a + sum(b, tail...))
不起作用,因为第二个模板在尾部返回类型中是未知的,只有第一个。使用C++14,返回类型的扣除是可能的:
template <class T1, class T2, class... T3>
auto sum(T1 a, T2 b, T3... tail)
{
return a + sum(b, tail...);
}
namespace details{
template<template<class,class>class binary_result, class T, class...Ts>
struct nary_result{using type=T};
template<template<class,class>class binary_result, class T0, class T1, class...Ts>
struct nary_result<binary_result, T0,T1,Ts...>:
nary_result<binary_result,binary_result<T0,T1>,Ts...>
{};
}
template<template<class,class>class binary_result, class...Ts>
using nary_result=typename details::nary_result<binary_result,Ts...>::type;
template<class Lhs, class Rhs>
using binary_sum_result = decltype(std::declval<Lhs>()+std::declval<Rhs>());
template<class...Ts>
using sum_result=nary_result<binary_sum_result,Ts...>;
应该做到这一点。
也许加上衰变。
相关文章:
- 如何获取std::result_of函数的返回类型
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 在 c++ 中将函数返回类型指定为模板参数
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 使用SFINAE来检测void返回类型函数的存在
- 模板返回类型函数如何在C++中工作
- 如何在返回类型函数模板的专用化中使用派生类型?( "couldn't infer template argument" )
- Bon appetit :从 int 返回类型函数在 main() 中打印字符串
- 在引用或指针返回类型函数上输入
- 在后面的返回类型函数语法中,auto关键字背后是否有意图
- 我可以在c++中重写字符串返回类型函数吗?