簡體   English   中英

只有typedef的c ++結構語法的含義

[英]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>

更多信息: “ typedef和C ++ 11類型別名之間的區別”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM