const массив const, чтобы использовать его элементы в определениях длины массива или задать значение параметров шаблона

Мне нужен постоянный массив констант, в котором его константы (элементы постоянного массива констант) могут использоваться там, где можно использовать только константу времени компиляции, например определения длины массива.

E.g:

int a[ my_const_array_of_const[0] ];
int b[ my_const_array_of_const[1] ];

template<int p>
foo() { ... };

foo< my_const_array_of_const[2] >();

Я пробовал решения из других ответов, но они не были достаточно «постоянными», чтобы компилятор не выдавал ошибку при их использовании в вышеуказанных ситуациях.

Как я могу создать константу my_const_array_of_const для компиляции в таких ситуациях?

Мне это нужно для настройки дизайна High-Level Synthesis (HLS). Синтаксис HLS C++ ограничен. Динамическая память не разрешена, поэтому мне нужно использовать статические массивы. Кроме того, все константы времени компиляции могут быть использованы для оптимизации работы аппаратного ускорителя (поэтому вместо переменных используются параметры шаблона).


person Ojos    schedule 16.06.2017    source источник
comment
Как насчет макроса?   -  person Barmar    schedule 16.06.2017
comment
Насколько я знаю, макросы #define могут определять только скаляры. Но на самом деле я пробовал что-то вроде: #define element(n,d) ==(n) ? d : #define my_const_array(i) (i) элемент(0,1) (i) элемент(1,2) (i) элемент(2,5) 0 Проблемы: (1) не очень элегантно, (2 ) длина ограничена, (3) и это приводит к очень длинным выражениям   -  person Ojos    schedule 16.06.2017
comment
Почему это должен быть массив?   -  person Barmar    schedule 16.06.2017
comment
Потому что мне нужно настроить настраиваемое количество объектов. Я хочу сохранить параметры конфигурации этих объектов в массиве, чтобы я мог получить доступ к param_a[0] для объекта 0, param_a[1] для объекта 1 и т. д.   -  person Ojos    schedule 16.06.2017


Ответы (1)


Вы можете использовать constexpr (начиная с C++11), которые гарантируют, что значение элемента массива может быть оценено во время компиляции. например

constexpr int my_const_array_of_const[2] {1, 2};

ПРЯМОЙ ЭФИР

person songyuanyao    schedule 16.06.2017
comment
Спасибо, это может работать на С++ 11. Однако я предполагаю, что мой инструмент для HLS (Vivado) использует более старую версию C++. Это дает мне следующую ошибку: ../../../src/main.cpp:8:1: ошибка: 'constexpr' не называет тип. ../../../src/main.cpp:8:1: примечание: C++0x 'constexpr' доступен только с -std=c++0x o -std=gnu++0x - person Ojos; 16.06.2017
comment
Есть ли другой способ сделать это с более ранними версиями С++? - person Ojos; 16.06.2017
comment
@ Охос, насколько я знаю, нет. Не могли бы вы скомпилировать с опцией -std=c++0x - person songyuanyao; 17.06.2017
comment
Симуляция (т. е. программа, скомпилированная и выполненная на ПК) отлично работает с этой опцией компилятора (т. е. с функциями С++ 11). Однако синтез не может использовать возможности C++. Если нет другого способа сделать это, мне нужно будет подождать, пока инструмент синтеза не реализует новые функции С++ 11. - person Ojos; 19.06.2017