преобразовать переменную в const - PullRequest
2 голосов
/ 08 декабря 2011

У меня есть массив, который я не знаю его размер до времени выполнения. После запуска программы и вычисления размера размер не изменится.

я проверил следующий код:

#include <iostream>
#include <boost/array.hpp>
#include <cstdint>

int main()
{

    uint32_t num_bits = 12;
    const uint32_t num_elements = 1 << num_bits;

    boost::array<double, num_elements > myArray; //does not work

    return 0;

}

следующий код не работает, так как num_elements вычисляется. Я видел, что есть опция "const_cast", но я не уверен, что это решит мою проблему.

Я бы оценил, если есть решение для повышения, так как я хотел бы использовать boost :: array.

EDIT num_bits - это параметр, который я читаю из файла, это значение также неизвестно до запуска. Мне известно о решении, использующем std :: vector, но скорость доступа также важна, так как я часто получаю доступ к этим элементам, и мое моделирование занимает около 3 дней ... В настоящее время я использую просто массив (new и delete)

Ответы [ 3 ]

4 голосов
/ 08 декабря 2011

Разве вы не можете использовать std::vector вместо boost::array? Размер std::vector может быть вычислен во время выполнения.

const_cast только преобразует переменную в / из const только во время выполнения, ее нельзя использовать для создания константы во время компиляции, которая boost::array (и новый C ++ 11 std::array) хочет.

4 голосов
/ 08 декабря 2011

Boost array для массивов, размер которых известен во время компиляции. Его аргументы должны быть константными выражениями.

Используйте std :: vector или аналогичный контейнер.

Хотя ваш пример не нужно вычислять во время выполнения:

const uint32_t num_bits = 12; // mark this const too
const uint32_t num_elements = 1 << num_bits;

boost::array<double, num_elements > myArray;
0 голосов
/ 08 декабря 2011

Аргумент к любому template должен быть постоянной времени компиляции (или типом). Если вы знаете num_bits во время компиляции, используйте ее как постоянную времени компиляции:

boost::array<double, (1 << num_bits)> myArray; //ok

Если размер не известен во время компиляции, тогда используйте динамически распределяемые массивы или std::vector.

...