[英]Default return value for a template variable
我有一個模板鏈接列表實現,其中
T List<T>::GetElementFromHead()
從列表的開頭返回值。 列表為空時應返回什么值。
template <class T>
T List<T>::GetElementFromHead()
{
T element;
if (!IsEmpty())
{
element = Head->value;
}
return element;
}
如果IsEmpty()
返回true,則return element;
引發異常。
在這種情況下,如何返回空值或空值?
列表為空時應返回什么值。
有兩個合理的選擇。
誰在乎。 設置為前提條件,只有在列表不為空時才調用GetElementFromHead()
,然后您可以編寫:
template <class T> T& List<T>::GetElementFromHead() { return Head->value; }
這有一些不錯的東西。 沒有副本。 它很快。 我可以根據需要修改值。 沒有多余的分支,因為您需要用戶先進行此操作。 無需擔心錯誤情況是什么,也不必擔心合理的哨兵值。 如果返回T{}
,如果T
為int
並且列表通常可以為0
,該怎么辦-用戶如何區分“真實” 0
和“偽” 0
?
這就是標准庫如何實現list::front()
, vector::front()
等的方法。像標准庫那樣做通常是一個不錯的決定。
是否將返回值本身封裝為真實值:
template <class T> std::optional<T> List<T>::GetElementFromHead() { if (!IsEmpty()) { return Head->value; } else { return std::nullopt; } }
(如果使用boost::optional
,最后一行應返回boost::none
)。 這樣,返回值本身可以清楚地表明我們所處的情況-我們要么有一個值,而該值位於列表的最前面,要么就沒有值。 同樣,無需提出定點要求。
此方法的替代版本是返回T*
,並在失敗時返回nullptr
。 這樣做的好處是不會產生副本,也不需要T
是可復制的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.