Есть ли способ сохранить набор std :: массивов любой (но постоянной) длины, где длина массива позже может быть использована в constexpr ?Хранение набора std :: массивов любой (но постоянной) длины
Я думаю, что стандартные контейнеры не могут быть рассмотрены, но может быть шаблонное решение каким-то образом. Вся информация доступна во время компиляции, не так ли?
Пример кода:
#include <iostream>
#include <string>
#include <vector>
#include <array>
#include <algorithm>
// Class storing an array of any (but constant) size
struct A {
const std::vector<std::string> container;
const int container_size;
A(const std::vector<std::string>& v, int size) : container(v), container_size(size) { }
};
int main() {
// List of variable length const arrays and their sizes
std::vector<A> myAList {
A({ std::string("String1"), std::string("String2") }, 2),
A({ std::string("String1") }, 1)
};
// How would I go about using the size of each array in a constexpr?
for (auto const& a : myAList) {
// Example constexpr:
// somefunc(std::make_index_sequence<a.container_size>{});
// 2nd example converting to actual std::array
// std::array<std::string, a.container_size> arr;
// std::copy_n(std::make_move_iterator(a.begin()), a.container_size, arr.begin());
}
return 0;
}
UPDATE:
Более подробно было предложено, так что здесь идет. Мне все равно, как определяется массив, все, что работает ... Точный constexpr используется в примере кода, std::make_index_sequence<CONSTEXPR>{}
. Я просто знаю, что у меня есть набор постоянных массивов, которые определены во время компиляции, и как-то можно будет ссылаться на их длину в другом месте в constexpr.
Heck, я на самом деле буду хорошо только с хранением длины:
// Class storing an array size
struct A {
A(int size) : container_size(size) { }
const int container_size;
};
int main() {
// List of lengths
std::vector<A> mySizeList { 2, 1 };
for (auto const& a : mySizeList) {
// somefunc(std::make_index_sequence<a.container_size>{});
}
return 0;
}
simpke Ответ Вы не можете.Более сложный ответ сводится к «возможно, в зависимости от того, какие именно операции constexpr и как именно вы создаете указанные массивы, а также другие детали, которые вы не включили», а реализация сложна. Вы только собираетесь назвать один конкретный 'somefunc' именно таким образом? – Yakk
@Yakk 'somefunc' - это функция вариационного шаблона, которая применяет аргументы к функции, вызываемой с помощью указателя функции. Мне нужна последовательность индексов времени компиляции для распаковки аргументов, поэтому требуется 'make_index_sequence'. – Oystein
Это да, или нет? ** «Вы только собираетесь назвать один конкретный« somefunc »именно таким образом?» ** Я принимаю «да», и я добавил ответ ниже. Он также передается в 'const &' в 'vector', если вам это тоже нужно. – Yakk