Под static_vector я имею в виду вектор, пространство для хранения которого находится внутри вектора (не выделенная куча), и он не может выйти за рамки CAPACITY времени компиляции. Примерно так:
Код: Выделить всё
template
struct static_vector {
unsigned char data[sizeof(T)*CAPACITY];
int size = 0;
template
constexpr void emplace_back(PARAMETERS &&...parameters) {
new(data + size * sizeof(T)) T(std::forward(parameters)...);
size++;
}
constexpr const T &operator[](int idx) const {
return std::launder(reinterpret_cast(data))[idx];
}
};
Если я попытаюсь использовать эту реализацию, я получаю различные ошибки, связанные с constexpr. Вот небольшая тестовая программа (godbolt):
Код: Выделить всё
struct Foo {
int x;
constexpr Foo(int x) : x(x) { }
};
constexpr int fn() {
static_vector a;
a.emplace_back(1);
a.emplace_back(2);
return a[0].x + a[1].x;
}
int main() {
constexpr int v = fn();
printf("%d\n", v);
}
(Я также пытался реализовать это с помощью объединения code>, но он выходит из строя по-другому)
Подробнее здесь: https://stackoverflow.com/questions/791 ... tic-vector
Мобильная версия