Поскольку вы не указали никакой языковой версии, отметили ее с помощью constexpr, я решил эту проблему, используя C ++ 17.Это без каких-либо грязных макросов.Вместо этого я полагаюсь на CTAD (вывод аргументов шаблона конструктора).
Прежде всего, я предположил, что ваши функции являются constexpr.Таким образом, все может быть сделано во время компиляции.(В полученном коде вы даже не видите использования памяти для массива.
constexpr int test_1(int a, int b, int c)
{
return a + b + c;
}
constexpr int test_2(int a, int b, int c)
{
return a * b * c;
}
Это не является строго необходимым, однако, это может переместить ненужные вычисления для компиляции времени. Это также позволяет распространятьconstexpr
до конечной переменной. Таким образом, вы можете гарантировать, что ни один из вычислений не будет выполнен во время выполнения.
static constexpr auto myArr = createFilledArray();
Однако наиболее важной частью является CTAD. Новый C ++ 17функция, которая позволяет вывести аргументы шаблона вашего класса на основе значений, переданных в конструкторе. Вместо того, чтобы сначала создавать массив, я создаю массив напрямую со всеми различными значениями, которые вы передаете ему. Так как вы не предоставилилюбые аргументы в вашем примере, я предполагаю, что они известны во время компиляции, что снова требуется для водопада constexpr. Однако, что более важно, я предполагаю, что число элементов известно во время компиляции.
Путем построения всехаргументы при вызове конструктора std::array
, нет необходимости указывать его шаблонаргументы (обратите внимание также на auto как тип возвращаемого значения).Для этого примера это выводится как std::array<int, 3>
.
constexpr auto createFilledArray(){
std::array a
{
test_1(1, 2, 3),
test_1(4, 5, 6),
test_2(7, 8, 9),
};
return a;
}
int main(int, char**)
{
return myArr.size(); // Returns 3
}
Код в проводнике компилятора
Из того, что я знаю, есть предложениедля C ++ 20 , который предназначен для создания std::vector
constexpr.Тем не менее, ни один из протестированных мной компиляторов не поддерживает это.Это, скорее всего, позволит вам писать код на основе std::vector
и использовать его во время компиляции.Другими словами, выделенная память, которая представляет ваши данные, будет частью вашего исполняемого файла.
Быстрая попытка того, как ваш код может выглядеть, можно найти здесь, в проводнике компилятора .(Тем не менее, в данный момент он не компилируется)