C++ 为类中的泛型类型数据成员分配空值

C++ 为类中的泛型类型数据成员分配空值,c++,class,generics,null,C++,Class,Generics,Null,我想给我的类中的数据成员分配某种类型的空值。对于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(nul

我想给我的类中的数据成员分配某种类型的空值。对于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;
        }
    }
};
模板
类循环缓冲区{
私人:
T arr[100]={};
int size=0;
第一,最后;
公众:
循环缓冲区(ints):大小,第一个(nullptr),最后一个(nullptr)
{}
T*增量(T*ptr){
如果(ptr==&arr[size-1])
返回&arr[0];
其他的
return++ptr;
}
无效写入(T数据){
if(first==nullptr){
arr[0]=数据;
第一个=最后一个=&arr[0];
}否则如果(增量(最后)=第一个){
抛出std::domain_错误(“必须使用overwrite()覆盖缓冲区中的最后一个值”);
}否则{
最后=增量(最后);
*最后=数据;
} 
}
T read(){
if(first==nullptr){
抛出std::domain_错误(“缓冲区中没有值”);
}否则{
T数据=*第一;
*第一个=0;
如果(第一个==最后一个){
最后一个=第一个=空PTR;
}否则{
第一个=增量(第一个);
}
返回数据;
}
}
};

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

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

*first=T{};
如果这不是一个选项,那么将数组的元素类型定义为
std::optional
,您可以将其设置为
std::nullopt
,例如:

std::可选的arr[100];
...
T数据=(第一->具有_值())?第一->值():T{};
*first=std::nullopt;