【问题标题】:Assigning a null value to a generic type data member in a class将空值分配给类中的泛型类型数据成员
【发布时间】:2021-02-07 05:16:38
【问题描述】:

我想为班级中的数据成员分配某种空值。对于 int 我可以只使用 0 但我不知道将使用的类型。

这是我的类定义

template <typename T>
class circular_buffer {

private:
    T arr [100] = {};
    int size = 0;
    T *first, *last;

public:
    circular_buffer(int s) : size(s), first(nullptr), last(nullptr)
    {}
    
    T* increment(T* ptr) {
        if (ptr == &arr[size-1])
            return &arr[0];
        else 
            return ++ptr;
    }
    
    void write(T data) {
        if (first == nullptr) {
            arr[0] = data;
            first = last = &arr[0];
        } else if (increment(last) == first) {
            throw std::domain_error("Must use overwrite() to overwrite last value in buffer");
        } else {
            last = increment(last);
            *last = data;
        } 
    }
    
    T read() {
        if (first == nullptr) {
            throw std::domain_error("No values in buffer");
        } else {
            T data = *first;
            *first = 0;
            if (first == last) {
                last = first = nullptr;
            } else {
                first = increment(first);
            }
            return data;
        }
    }
};

在 read() 内部,我将 *first 赋值为零。有这样做的标准方法吗?

【问题讨论】:

    标签: c++ class generics null


    【解决方案1】:

    只有指针可以设置为nullptr。您应该简单地使用类型自己的默认值,例如:

    *first = T{};
    

    如果这不是一个选项,则将数组的元素类型定义为std::optional&lt;T&gt;,您可以将其设置为std::nullopt,例如:

    std::optional<T> arr [100];
    
    ...
    
    T data = (first->has_value()) ? first->value() : T{};
    *first = std::nullopt;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2022-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      相关资源
      最近更新 更多