C++ 从模板化函数返回空对象
我正在构建一个模板堆栈类。当用户调用top时,如果堆栈为空,我想返回一个伪项。如果我的堆栈是int类型,我将返回-1。但是,我的堆栈是T类型的,所以我不确定返回什么。我想返回一个伪节点,但不确定如何初始化它,因为直到main()才声明该类型。我应该寄什么作为回报?我什么也不退吗?对于类型为T的对象,nullptr的等价物是什么C++ 从模板化函数返回空对象,c++,templates,stack,C++,Templates,Stack,我正在构建一个模板堆栈类。当用户调用top时,如果堆栈为空,我想返回一个伪项。如果我的堆栈是int类型,我将返回-1。但是,我的堆栈是T类型的,所以我不确定返回什么。我想返回一个伪节点,但不确定如何初始化它,因为直到main()才声明该类型。我应该寄什么作为回报?我什么也不退吗?对于类型为T的对象,nullptr的等价物是什么 template <typename T> struct Node { T val; Node<T>* nextItem;
template <typename T>
struct Node {
T val;
Node<T>* nextItem;
Node(T val_, Node<T>* nextItem_ = nullptr) : val(val_), nextItem(nextItem_) {};
};
模板
结构节点{
T值;
节点*nextItem;
Node(T val_,Node*nextItem_=nullptr):val(val_),nextItem(nextItem_){};
};
template//此顶级函数。
T Stack::top()常量{
如果(!isEmpty())返回topItem->val;
cout让堆栈类模板处理这个问题的一种方法是使用一个helper类,该类可以返回一个对于给定类型无效的值
// 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();
}
等等。抛出异常,返回可选的,默认的T(T{}
,假设它存在)可自定义的特征是可能的。我想返回一个虚拟项,我建议不要这样做。对于int
之类的东西,没有有效的虚拟值。-1
是非常常见的整数值,会导致误报。我建议抛出一个异常,或者使用std::optional
作为返回类型。@NathanOliver我将抛出一个异常。谢谢!您可以返回一个默认构造的Treturn{}但正如@Nathan所说的,我建议不要这样做,因为默认构造的对象也可能是有效的。异常或std::optional
。我认为这不是一个好方法。这些值实际上都不是无效的。你无法知道无效值的一般含义。为什么不直接使用std::optional
或抛出例外?@NathanOliver,我理解你的观点。这是工具箱中的另一个工具。@JesperJuhl,当我回应NathanOliver的评论时,这是工具箱中的另一个工具。
// 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();
}
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;}
};