2016-10-26 2 views
2

У меня есть реализация шаблона списка ссылок, в которомПо умолчанию Возвращаемого значения переменного шаблона

T List<T>::GetElementFromHead() 

возвращает значение из головы списка. Какое значение должно быть возвращено, когда список пуст.

template <class T> 
T List<T>::GetElementFromHead() 
{ 
    T element; 
    if (!IsEmpty()) 
    { 
     element = Head->value; 
    } 
    return element; 
} 

Если IsEmpty() возвращает истинный затем return element; бросает исключение.

Как вернуть значение null или или пустое значение в этом случае?

+0

Если 'IsEmpty()' is true, элемент выдает исключение, потому что вы пытаетесь вернуть объявленную, но неинициализированную переменную. –

+1

В общем, вы этого не делаете. Выброс исключения звучит хорошо для меня. – melpomene

+0

Убедитесь, что типы, используемые в качестве параметра шаблона T, имеют действительные конструкторы по умолчанию и копии – user3159253

ответ

3

Какое значение должно быть возвращено, когда список пуст.

Существует два разумных варианта.

  1. Кому это нужно. Установить в качестве предварительного условия, что GetElementFromHead() наречется только если список не пуст, а затем вы можете просто написать:

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

    Это имеет несколько хороших вещей об этом. Никаких копий. Это быстро. Я могу изменить значение, если захочу. Никакой дополнительной ветки, поскольку вы требуете от пользователя сделать это спереди. Не нужно беспокоиться о том, что такое ошибка или подходит ли разумное значение дозорного. Если вы вернетесь T{}, что делать, если T - int, а в списке может быть 0 обычно - как пользователь проводит различие между «реальным» 0 и «фальшивым» 0?

    Так стандартная библиотека реализует list::front(), vector::front() и т. Д. Как обычно, стандартная библиотека - это хорошее решение.

  2. Encapsulate в самой возвращаемого значения, будь-или нет это реальное значение:

    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 был выполнен с возможностью копирования.

Смежные вопросы