当元素是结构时,模板返回
template return when Element is a struct
所以正如标题所说,我有这个问题。我正在实现一个双向链表作为模板和一些功能,例如
Element getFirst();
Element getLast();
Element getPosition(int position);
它们应该返回元素类型的元素。问题是,如果列表为空怎么办?那我该报什么?我不能返回 0 或某个整数,因为如果我的元素是结构体怎么办。稍后将在代码中崩溃。那我应该怎么回去?我尝试创建一个类型为 Element 的空变量并发送它,但这也不起作用。有什么想法吗?
我可以提供您需要的任何代码或信息。问问就行
解决方案取决于您:
- 如果在空容器上调用函数,则具有未定义的行为。您应该清楚地记录这些情况。在这种情况下,用户必须通过例如
empty
方法检查对函数的调用是否有效。std::vector::front
就是这种情况。 - 像
std::vector::at
一样抛出异常。 - 返回
boost::optional
如另一个答案中所述 - 返回注释中建议的指针或迭代器
- 由于您不返回对元素的引用,因此您还可以返回类型
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
初始化。默认构造函数创建一个标记为没有有效T
的optional<T>
对象。
相关文章:
- lower_bound()返回最后一个元素
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- 这个返回元素位置的基于循环的函数有什么问题?
- 为什么这个程序没有打印返回的迭代器的正确第二个元素?
- 反转后不返回最后一个元素
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 为什么 min_element() 返回最小元素的索引,而不是迭代器?
- 第 i 个元素返回 i 的函数数组
- 将新元素添加到列表中,并返回对该元素的引用?
- C++ 将向量中出现 n 次的所有元素作为向量返回
- 为什么将函数的返回类型从结构节点*更改为void后,链表的元素没有显示create_ll和显示?
- 元函数使用 decltype 返回元素类型
- Rcpp::Vector <RTYPE>的类返回元素的模板
- 为什么指向 c 字符串中元素的指针不只返回元素?
- 迭代器:如果 '*' 返回元素的引用,为什么删除 *(myList.end()) 会给出 SegFault
- 不确定为什么这不返回元素的索引?
- 在向量中的索引处返回元素
- 返回元素的速度比通过引用和修改发送元素的速度慢
- 函数采用向量、索引和返回元素
- c++返回元素在没有代码的行上给出访问冲突