2017-03-27 69 views
6
template <typename T, typename R, typename ...A> 
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); }; 

這是什麼意思?我需要一些幫助〜struct decay <T,R(A ...,...)>是什麼意思

+1

你從哪裏看到該代碼?它看起來類似於某人合理用於實現'std :: decay'的內容,但沒有理由使用'T' ......我的第一個假設是你錯誤地複製了它。 – Yakk

+0

@Yakk:這段代碼來自boost :: hana。 –

+1

Aha:http://www.boost.org/doc/libs/1_62_0/libs/hana/doc/html/structboost_1_1hana_1_1detail_1_1decay.html這是一個優化。這解釋了否則無意義的設計;他們正在解決模板實例化的低效問題。 – Yakk

回答

7
int foo(int); 
int bar(int, ...); 

這些是兩個不同的功能。 foo類型爲int(int)bar類型爲int(int,...)

...是C風格的可變參數,不要與也使用...的variardic模板參數混淆。

template <typename T, typename R, typename ...A> 
struct decay<T, R(A..., ...)> { using type = R(*)(A..., ...); }; 

std::decayboost::hana的優化版本實現的這一部分。 typename TT零件是紅鯡魚,這是優化的一部分。

它是一個專門匹配R(A..., ...),其中A...R是從函數簽名中推導出來的。

如果通過double(int, char, ...)作爲第二個參數到這個hana::details::decayRdoubleA...int, char。而...將「匹配C風格的varags」。

這個特殊的專業化的目的是映射函數簽名,以C樣式可變參數結尾,指向相同的簽名。因此它將double(int, char, ...)映射到double(*)(int, char, ...)

C樣式可變參數與模板variardic參數不一樣。他們早於它。

+0

非常感謝。這就是我想知道的。 –

6

這個專門化是將函數類型衰減到相應的指針函數類型的專門化之一,它反映了函數左值衰減到函數指針前值的方式。

這個特殊的專門用於變量參數函數(那些參數列表以省略號結尾,以便它接受與任何參數不匹配的參數)。

+0

有什麼不同?我不明白爲什麼會出現這樣的兩個參數「decay」。 – Yakk

+1

'template struct decay {using type = R(*)(A ...,...); };'是專門用於捕獲特定類型函數簽名的'decay'。我不明白爲什麼你會有一個兩個參數的衰減版本,然後忽略第一個參數。 – Yakk

+0

@KerrekSB:我不太明白你說的話,你能解釋一下嗎? –