Возврат нулевого объекта из шаблонной функции - PullRequest
0 голосов
/ 29 октября 2019

Я создаю шаблонный класс стека. Когда пользователь вызывает top, если стек пуст, я хочу вернуть фиктивный элемент. Если бы мой стек был типа int, я бы возвратил -1. Но мой стек имеет тип T, поэтому я не уверен, что возвращать. Я хочу вернуть фиктивный узел, но не уверен, как его инициализировать, учитывая, что тип не объявлен до main (). Что я должен отправить обратно взамен? Я ничего не возвращаю? Что эквивалентно nullptr для объектов типа T?

template <typename T>
struct Node {
    T val;
    Node<T>* nextItem;
    Node(T val_, Node<T>* nextItem_ = nullptr) : val(val_), nextItem(nextItem_) {};
};
template <typename T> // This top function.
T Stack<T>::top() const {
    if (!isEmpty()) return topItem->val;
    cout << "[WARNING] Stack is empty! Sending dummy object." << endl;
    // return nullptr; // <-- Wrong. What should I return?
}

1 Ответ

0 голосов
/ 29 октября 2019

Один из способов разрешить шаблону стекового класса справиться с этой проблемой - использовать вспомогательный класс, который может возвращать значение, которое считается недействительным для данного типа.

// Declared but not defined.
template <typename T> struct InvalidValue;


// Use it generically.
template <typename T> // This top function.
T Stack<T>::top() const {
    if (!isEmpty()) return topItem->val;
    cout << "[WARNING] Stack is empty! Sending dummy object." << endl;
    return InvalidValue<T>::get();
}

Теперь определите специализации InvalidValue для типов, которые вам нужны.

template <> struct InvalidValue<int>
{
   static int get() { return -1;}
};

template <> struct InvalidValue<char>
{
   static char get() { return '\0';}
};

template <> struct InvalidValue<double>
{
   static double get() { return FLT_MIN;} 
};

и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...