我看到这段代码用于实现类似 C++
std::variant
的类型。该类用作变体存储。
缓冲区数组存储什么?
alignas(Types...) unsigned char buffer[sizeof(LargestT)];
我还在学习中,但就我的理解,也许是错误的,它存储了模板包列表的当前最大类型。
#include <new> // for std::launder()
template<typename... Types>
class VariantStorage {
using LargestT = LargestType<Typelist<Types...>>;
// What stores the following buffer array?
alignas(Types...) unsigned char buffer[sizeof(LargestT)];
unsigned char discriminator = 0;
public:
unsigned char getDiscriminator() const {
return discriminator;
}
void setDiscriminator(unsigned char d) {
discriminator = d;
}
void* getRawBuffer() {
return buffer;
}
const void* getRawBuffer() const {
return buffer;
}
template<typename T>
T* getBufferAs() {
return std::launder(reinterpret_cast<T*>(buffer));
}
template<typename T>
T const* getBufferAs() const {
return std::launder(reinterpret_cast<T const*>(buffer));
}
};
有人可以解释一下这行代码的目的是什么吗? 预先感谢您!
这个想法是变体有一个可以存储所有替代类型的缓冲区。
为此,缓冲区不仅需要与最大类型一样大(就大小而言),而且还必须具有与所有类型兼容的对齐方式。
alignas(Types...)
属性正是这样做的。