[英]meaning of c++ struct syntax with only typedef
當我檢查某些庫中的某些代碼片段時,我看到了一些類似以下的代碼:
template<typename _Function, typename _ReturnType>
struct _TaskOfType_ContinuationTypeTraits
{
typedef task<typename _TaskTypeTraits<typename _FunctionTypeTraits<_Function, _ReturnType>::_FuncRetType>::_TaskRetType> _TaskOfType;
};
有人可以提供一些代碼解釋嗎? 它試圖做什么?在主體中使用僅帶typedef語句的結構有什么好處?
用C ++的話來說, _TaskOfType_ContinuationTypeTraits
是一個元函數。 它在編譯時進行類型計算。
元功能在某種程度上類似於運行時功能。 關鍵區別在於元函數的輸入參數是類型,而返回值也是類型。
例如。 以下元函數接受一個類型,並返回您為其提供的類型的指針。
template <typename T>
struct add_pointer
{
typedef T* type;
}
現在,如果您執行了add_pointer<int>::type
,它將返回int*
。 可以看到,給了它一個類型(在這種情況下為int
),編譯器計算了一個新類型(在這種情況下為int*
),並在調用元函數的::: ::type
時將其還給了您。 在元函數上執行::type
時,即實例化模板時。 這相當於調用一個函數的運行時。 還要注意,所有這些都是在編譯時發生的!
現在,返回到_TaskOfType_ContinuationTypeTraits
。 就像我的add_pointer
。 在add_pointer
,我只有一個模板參數,而您有兩個。 我只是添加了一個指向所提供類型的指針,所以您要復雜得多。 但是,從本質上講,它只是類型計算。 當我調用::type
時,我的add_pointer
返回,而當調用::_TaskOfType
時,您的::_TaskOfType
。
這種語法用於創建“模板化typedef”。 在C ++ 11及更高版本中,應改用類型別名/別名模板 。
您發布的代碼段的目的是創建依賴於_Function
和_ReturnType
的類型別名。
可以這樣訪問:
typename _TaskOfType_ContinuationTypeTraits<F, R>::_TaskOfType
如果您可以使用C ++ 11,則這是一種更干凈,更好,更直接的解決方案:
template<typename _Function, typename _ReturnType>
using _TaskOfType =
task<typename _TaskTypeTraits<
typename _FunctionTypeTraits<_Function, _ReturnType>::_FuncRetType>::_TaskRetType>
可以這樣使用:
_TaskOfType<F, R>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.