[英]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...>;
應該可以。
也許增加衰減。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.