从模板函数返回空对象

时间:2019-10-29 16:45:20

标签: c++ templates stack

我正在构建模板堆栈类。当用户调用top时,如果堆栈为空,我想返回一个虚拟项目。如果我的堆栈是int类型,则返回-1。但是,我的堆栈的类型为T,所以我不确定返回什么。我想返回一个虚拟节点,但是由于类型直到main()才声明,所以不知道如何初始化它。我应该退还什么?我什么也不退货吗?对于类型T的对象,nullptr等于什么?

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 :(得分:0)

让堆栈类模板处理该问题的一种方法是使用一个助手类,该类可以返回对于给定类型无效的值。

// 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;} 
};