Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从模板化函数返回空对象_C++_Templates_Stack - Fatal编程技术网

C++ 从模板化函数返回空对象

C++ 从模板化函数返回空对象,c++,templates,stack,C++,Templates,Stack,我正在构建一个模板堆栈类。当用户调用top时,如果堆栈为空,我想返回一个伪项。如果我的堆栈是int类型,我将返回-1。但是,我的堆栈是T类型的,所以我不确定返回什么。我想返回一个伪节点,但不确定如何初始化它,因为直到main()才声明该类型。我应该寄什么作为回报?我什么也不退吗?对于类型为T的对象,nullptr的等价物是什么 template <typename T> struct Node { T val; Node<T>* nextItem;

我正在构建一个模板堆栈类。当用户调用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_) {};
};
模板
结构节点{
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我将抛出一个异常。谢谢!您可以返回一个默认构造的T
return{}但正如@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;} 
};