2014-10-23 3 views
2

Я хочу создать объект std::array<T, N>, но проблема в том, что я могу использовать только функции, возвращающие тип constexpr, или компилятор будет жаловаться. Проблема здесь заключается в том, что мне нужно, чтобы вычислить длину этого массива на основе размера другого массива, который может быть что-то вроде этого:создание std :: array с размером, вычисленным во время выполнения

template <typename T> 
struct DataLength 
{ 
    template <typename iter> 
    size_t maxPossibleLength(iter begin, iter end) 
    { 
     size_t m_size = 0; 
     while (begin != end) { 
      m_size = m_size << 8 | std::numeric_limits<T>::max(); /* 0xff for uchar*/ 
      begin++; 
     } 
     return m_size; 
    } 
} 

как я могу преобразовать вывод этой функции, так что я могу использовать его вместо N ?

+6

'STD :: array' должно быть известно во время компиляции. Массив размера времени выполнения - 'std :: vector'. –

+1

Как T.C. говорит, ответ на ваш вопрос: «Вы не можете создать' std :: array' с размером, рассчитанным во время выполнения ». Вы можете использовать 'std :: vector' или дать нам дополнительную информацию о проблеме, которую вы пытаетесь решить, поэтому мы можем предложить альтернативные подходы. – Casey

+0

было бы неплохо указать причину понижения голосов. В моем вопросе нет проблем, проблема заключается в возможностях языка C++. – Barracuda

ответ

2

Вы можете написать это как рекурсивную функцию constexpr и выполнить вычисления по длине исходного массива, который также должен быть временем компиляции.

Дело в том, что ваша функция (если я ее правильно понял) не нуждается в итераторе. Она нуждается в длину N. так что он может сделать что-то вроде:

template<typename T> 
constexpr size_t maxLength(size_t n, size_t m_size=0) { 
    return n==0 ? m_size : maxLength<T>(n-1, m_size << 8 | std::numeric_limits<T>::max()); 
} 

И это работает: размер

std::array<int, 15> a; 
std::array<float, maxLength<int>(a.size())> b; 
+0

Я не получил ваш вопрос, не могли бы вы рассказать о нем примером? – Barracuda

+0

Здесь я пробовал .. – Elazar

+0

Что такое 'T' в вашем коде? – borisbn