我正在构建模板堆栈类。当用户调用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?
}
答案 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;}
};
等