当元素是结构时,模板返回

template return when Element is a struct

本文关键字:返回 元素 结构      更新时间:2023-10-16

所以正如标题所说,我有这个问题。我正在实现一个双向链表作为模板和一些功能,例如

Element getFirst();
Element getLast();
Element getPosition(int position);

它们应该返回元素类型的元素。问题是,如果列表为空怎么办?那我该报什么?我不能返回 0 或某个整数,因为如果我的元素是结构体怎么办。稍后将在代码中崩溃。那我应该怎么回去?我尝试创建一个类型为 Element 的空变量并发送它,但这也不起作用。有什么想法吗?

我可以提供您需要的任何代码或信息。问问就行

解决方案取决于您:

  1. 如果在空容器上调用函数,则具有未定义的行为。您应该清楚地记录这些情况。在这种情况下,用户必须通过例如empty方法检查对函数的调用是否有效。std::vector::front就是这种情况。
  2. std::vector::at一样抛出异常。
  3. 返回boost::optional如另一个答案中所述
  4. 返回注释中建议的指针或迭代器
  5. 由于您不返回对元素的引用,因此您还可以返回类型 T 的默认构造对象,理想情况下,该对象有一种方法可以检查它是否无效。类似于QHash::value所做的。

无论哪种情况,您都必须在代码中的某个位置进行检查。

有几个选项:

  • 提供一个查询方法,以查看对象是否可以支持操作(例如,empty (。

  • 返回可以表示"空"的东西。 例如,您可以返回(const(指针或optional<Element>

另一种可行的方法,但

应该避免,是抛出一个例外。

使用 boost::optional .您可以将返回类型更改为 boost::optional<Element>boost::optional在上下文中可转换为bool。因此,一个示例用途是:

if(yourList.getFirst())
  std::cout << "Found the first element." << std::endl;
else
  std::cout << "No first element exists." << std::endl; 

在后台,boost::optional<T>维护一个bool,指示对象是否已使用有效T初始化。默认构造函数创建一个标记为没有有效Toptional<T>对象。