簡體   English   中英

模板中的自動返回類型

[英]Auto return type in template

我在代碼的各個模塊中擁有多個數據類,我無意進行任何修改。 我為每個容器都有一個容器類,這些容器類有一個指向該數據類的指針,還有一個指向旨在保留這些類而不知道它們的類的指針。

因此,在容器類中,我實現了:

DataClass GetMyData (void){
   return myData;
}

在這些硬幣容器類的集合中,我創建了

template<class ContainerClass>
ContainerClass  GetContainer (void);

template<class ContainerClass>
auto    GetData (void){
    GetContainer<ContainerClass> ().GetMyData();
}

但是每當我嘗試使用此GetData函數時,都會收到錯誤消息

返回'auto'的函數在定義之前不能使用

所以我的問題是,在這種情況下是否可以使用auto(c ++ 11),或者我必須使用2個類制作模板?

如果您忘記了returnGetData() auto 不能正常工作是無用的返回由返回同一類型getData()的模板類型的(感謝Jarod42!)。

無論如何...給出了以下兩個結構

struct A
 { int getData () const { return 1; } };

struct B
 { std::string getData () const { return "abc"; } };

在C ++ 14中, GetData()可以簡單地寫為

template <class CC>
auto GetData ()
 { return CC{}.getData(); }

但這在C ++ 11中不起作用。 在C ++ 11中,您可以編寫

template <class CC>
auto GetData () -> decltype( CC{}.getData() )
 { return CC{}.getData(); }

在C ++ 11之前,沒有(這種使用) auto

-編輯-

正如StoryTeller所指出的那樣,使用decltype( CC{}.getData() )假定CC類型是默認可構造的。

在我編寫的玩具示例中,這不是問題,因為我在函數主體中使用了CC{}

在簡單的情況下,您可以在decltype()表達式中鏡像函數主體中返回的內容。 例如,如果傳遞CC類型的對象,則可以編寫

template <class CC>
auto GetData (CC const & cc) -> decltype( cc.getData() )
 { return cc.getData(); }

但是,它從未如此簡單:在某些情況下,您知道返回的值是給定的表達式,但是函數要復雜到將其鏡像到decltype()表達式中。

因此,為避免可構造/不可構造的問題,最好使用(如StoryTeller所建議;謝謝) std::declval ; 如下,例如

template <class CC>
auto GetData () -> decltype( std::declval<CC>().getData() )
 { /* something complicated ... */ return something.getData(); }

暫無
暫無

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

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