c++ - 模板变量的默认返回值

标签 c++ c++11 templates

我有一个模板链接列表实现,其中

T List<T>::GetElementFromHead()

返回列表头部的值。当列表为空时应返回什么值。

template <class T>
T List<T>::GetElementFromHead()
{
    T element;
    if (!IsEmpty())
    {
        element = Head->value;
    }
    return element;
}

如果IsEmpty()返回true,则return element;抛出异常。

在这种情况下如何返回 null 或空值?

最佳答案

What value should be returned when the list is empty.

有两个合理的选择。

  1. 谁在乎呢。设置为仅当列表不为空时才调用 GetElementFromHead() 的前提条件,然后您可以编写:

    template <class T>
    T& List<T>::GetElementFromHead() {
        return Head->value;
    }
    

    这有几个好处。没有拷贝。它很快。如果我愿意,我可以修改该值。没有额外的分支,因为您要求用户预先执行此操作。无需担心错误情况是什么或得出合理的哨兵值。如果返回 T{},如果 Tint 并且列表通常可以有 0 会怎样 - 如何用户如何区分“真实”0 和“假”0

    这就是标准库实现 list::front() 的方式, vector::front()等。像标准库那样做通常是一个不错的决定。

  2. 封装在返回值本身中,无论它是否是真实值:

    template <class T>
    std::optional<T> List<T>::GetElementFromHead() {
        if (!IsEmpty()) {
            return Head->value;
        }
        else {
            return std::nullopt;
        }
    }
    

    (如果使用 boost::optional,最后一行应返回 boost::none)。这样,返回值本身就清楚地表明了我们所处的情况 - 我们要么有一个值并且该值位于列表的前面,要么我们没有值。再次强调,无需设置哨兵。

    此方法的另一个版本是在失败时返回 T*nullptr。这样做的优点是它不会产生拷贝或要求 T 可复制构造。

关于c++ - 模板变量的默认返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40272188/

相关文章:

c++ - 使用 std::list 作为循环列表是否安全?

c++ - 枚举类默认整数值

c++ - 获取传入 UDP 数据包的目标端口

c++ - 在搜索算法上获得微秒输出

c++ - 在 Windows 上以像素为单位获取 OpenGL 点大小?

c++ - 模板类调用模板函数 - 链接器错误

css - 无法识别 django css 文件 - 配置错误?

c++ 抽象基类私有(private)成员

c++ - 不可复制和 move 构造函数

c++ - 模板是否可以专门用于标准库类而不包含该类的标题?