Что делать в (шаблонном) методе pop стека, когда стек пуст? - PullRequest
0 голосов
/ 02 июня 2018

Я написал шаблонный класс контейнера, который принимает тип и шаблон параметра шаблона.

template<class type, template<typename...> class Seq>
class stack1
{
private:
    int count;
    int size;
    Seq<type> st;
    //Seq<string> str;

public:
    stack1(size_t size):size(100), count(-1){ }
    void push(type elem);
    type pop();

};


template<class type, template<typename...> class Seq>
type stack1<type, Seq>::pop()
{
    if (count < 0)
    {
        cout << "stack1 is empty," << endl;
        /*How to handle this condition.*/

    }
    else
    {
        type elem; 
        elem = st.back();
        st.pop_back();
        count--;
        return elem;
    }
}

Мой вопрос в функции pop: как мне обрабатывать сценарий ошибки, когда контейнерный объект пуст.Я хочу вернуть некоторое значение по умолчанию в этом случае, например, 0 / -1, если контейнер int или "" / null, если это строка, или 0.0, если это float ... что-то вроде этого.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

@ Предложение RSahu - хорошая вещь.

Альтернативой может быть изменение подписи функции pop() с:

type pop();

на

std::optional<type> pop();

и возврат std::nullopt, если стек пуст или обычное значение в обернутом случае:

if (count < 0) {
    return std::nullopt;
}

Обратите внимание, что std::optional введен в стандарте языка C ++ 17;в C ++ 14 он имеет значение std::experimental::optional, или вы можете использовать boost::optional для C ++ 11 и более ранних версий.

PS: плохая идея иметь значение -1, когда число элементовна самом деле 0 - очень сбивает с толку!

0 голосов
/ 02 июня 2018

Один из способов справиться с этим - создать исключение.

if (count < 0)
{
    throw std::out_of_range("stack1 is empty");
}

Я бы настоятельно не рекомендовал использовать std::cout для вывода сообщения на терминал в этом месте.Использование std::cout в реализациях структур данных является плохой практикой программирования.

...