簡體   English   中英

模板變量的默認返回值

[英]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; 引發異常。

在這種情況下,如何返回空值或空值?

列表為空時應返回什么值。

有兩個合理的選擇。

  1. 誰在乎。 設置為前提條件,只有在列表不為空時才調用GetElementFromHead() ,然后您可以編寫:

     template <class T> T& List<T>::GetElementFromHead() { return Head->value; } 

    這有一些不錯的東西。 沒有副本。 它很快。 我可以根據需要修改值。 沒有多余的分支,因為您需要用戶先進行此操作。 無需擔心錯誤情況是什么,也不必擔心合理的哨兵值。 如果返回T{} ,如果Tint並且列表通常可以為0 ,該怎么辦-用戶如何區分“真實” 0和“偽” 0

    這就是標准庫如何實現list::front()vector::front()等的方法。像標准庫那樣做通常是一個不錯的決定。

  2. 是否將返回值本身封裝為真實值:

     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.

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