3 回答

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊
我認(rèn)為問(wèn)題在于,可變參數(shù)函數(shù)模板僅在您指定其返回類型后才視為已聲明,因此sumin decltype永遠(yuǎn)無(wú)法引用可變參數(shù)函數(shù)模板本身。但是我不確定這是GCC錯(cuò)誤還是C ++ 0x根本不允許這樣做。我的猜測(cè)是C ++ 0x不允許在->decltype(expr)零件中進(jìn)行“遞歸”調(diào)用。
作為解決方法,我們可以避免->decltype(expr)使用自定義特征類進(jìn)行此“遞歸”調(diào)用:
#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您的程序替換為typename sum_type<T,P...>::type并進(jìn)行編譯。
編輯:由于這實(shí)際上返回,decltype((a+b)+c)而不是decltype(a+(b+c))更接近于您使用加法的方式,因此您可以用此替換最后一個(gè)專業(yè)化:
template<class T, class U, class... P> struct sum_type<T,U,P...>
: id<decltype(
val<T>()
+ val<typename sum_type<U,P...>::type>()
)>{};

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊
C ++ 14的解決方案:
template <class T, class... P>
auto sum(const T& t, const P&... p){
return t + sum(p...);
}
返回類型自動(dòng)扣除。

TA貢獻(xiàn)1841條經(jīng)驗(yàn) 獲得超3個(gè)贊
顯然,您不能以遞歸方式使用decltype(至少目前是這樣,也許他們會(huì)解決它)
您可以使用模板結(jié)構(gòu)來(lái)確定總和的類型
看起來(lái)很丑但是可以用
#include <iostream>
using namespace std;
template<typename... T>
struct TypeOfSum;
template<typename T>
struct TypeOfSum<T> {
typedef T type;
};
template<typename T, typename... P>
struct TypeOfSum<T,P...> {
typedef decltype(T() + typename TypeOfSum<P...>::type()) type;
};
template <class T>
T sum(const T& in)
{
return in;
}
template <class T, class... P>
typename TypeOfSum<T,P...>::type sum(const T& t, const P&... p)
{
return t + sum(p...);
}
int main()
{
cout << sum(5, 10.0, 22.2) << endl;
}
- 3 回答
- 0 關(guān)注
- 489 瀏覽
添加回答
舉報(bào)