当Element是结构时,模板返回

时间:2015-06-01 18:41:35

标签: c++

因为标题声明我有这个问题。我正在实现一个双向链接列表作为模板和一些功能,如

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

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

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

3 个答案:

答案 0 :(得分:5)

解决方案取决于您:

  1. 如果在空容器上调用函数,则具有未定义的行为。您应该清楚地记录这些案例。在这种情况下,用户必须通过例如empty方法检查对函数的调用是否有效。这是std::vector::front的情况。
  2. 抛出std::vector::at之类的异常。
  3. 按照其他答案
  4. 中的描述返回boost::optional
  5. 返回指针或迭代器,如评论
  6. 中建议的那样
  7. 由于您没有返回对元素的引用,您还可以返回类型为T的默认构造对象,理想情况下可以检查它是否无效。与QHash::value的内容类似。
  8. 在任何一种情况下,您都必须在代码中的某处进行检查。

答案 1 :(得分:2)

使用boost::optional。您可以将返回类型更改为boost::optional<Element>boost::optionalcontextually convertible to 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初始化。默认构造函数创建一个标记为没有有效optional<T>的{​​{1}}对象。

答案 2 :(得分:2)

有几种选择:

  • 提供查询方法以查看对象是否支持op(例如empty)。

  • 返回可能表示“空”的内容。例如,您可以返回(const)指针,或optional<Element>

一种可行但应该避免的不同方法是抛出异常。