第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用帶有可變參數(shù)模板函數(shù)的decltype的尾隨返回類型

使用帶有可變參數(shù)模板函數(shù)的decltype的尾隨返回類型

C++
拉風(fēng)的咖菲貓 2019-11-03 08:04:37
我想編寫一個(gè)簡(jiǎn)單的加法器(用于傻笑),將每個(gè)參數(shù)加起來(lái)并返回具有適當(dāng)類型的和。目前,我有這個(gè):#include <iostream>using namespace std;template <class T>T sum(const T& in){   return in;}template <class T, class... P>auto sum(const T& t, const P&... p) -> decltype(t + sum(p...)){   return t + sum(p...);}int main(){   cout << sum(5, 10.0, 22.2) << endl;}在GCC 4.5.1上,這似乎可以很好地用于2個(gè)參數(shù),例如sum(2,5.5)返回7.5。但是,使用了比這更多的參數(shù),我得到的錯(cuò)誤是尚未定義sum()。如果我這樣聲明sum():template <class T, class P...>T sum(const T& t, const P&... p);然后它適用于任意數(shù)量的參數(shù),但是sum(2,5.5)將返回整數(shù)7,這不是我期望的。對(duì)于兩個(gè)以上的參數(shù),我認(rèn)為decltype()必須進(jìn)行某種遞歸才能得出t + sum(p ...)的類型。這是合法的C ++ 0x嗎?還是decltype()僅適用于非變量聲明?如果是這樣,您將如何編寫這樣的函數(shù)?
查看完整描述

3 回答

?
慕村9548890

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>()

)>{};



查看完整回答
反對(duì) 回復(fù) 2019-11-04
?
holdtom

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)扣除。



查看完整回答
反對(duì) 回復(fù) 2019-11-04
?
偶然的你

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;

}



查看完整回答
反對(duì) 回復(fù) 2019-11-04
  • 3 回答
  • 0 關(guān)注
  • 489 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)