На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Возведение в целую степень , при инициализации константы.
    Всем привет! Можно этот неработающий код заменить каким либо костылём?
    ...отличным от size = 2 * 2 * 2 = 8
    ExpandedWrap disabled
      const WORD power ( BYTE base, BYTE exponent )
      {
          WORD value = base;
          for ( BYTE index = 1; index < exponent; index ++ )
          value *= base;
          return value;
      }
      const BYTE base = 2, exponent = 3;
      const WORD size = power ( base, exponent );
      BYTE list [ size ];
    Сообщение отредактировано: FateFlex -
      А нужна степень двойки или чего угодно?
        constexpr же

        ExpandedWrap disabled
          #include <iostream>
          using namespace std;
           
          constexpr int power(int base, int exponent) {
              return (exponent == 1) ? base : (base * power(base, exponent - 1));
          }
           
          int main() {
            int  list [power(2, 3)];  
            cout << sizeof(list) / sizeof(int);
            return 0;
          }
          шаблонами пробовал - тоже не хочет компилироваться

          MBo, ...степень чего угодно, иначе можно было бы << использовать :yes:

          jack128, constexpr - крутая штука, но в Visual C++ 2010 Express не определена :'(

          видимо числом придётся задать или переезжать на 2015, если нет конечно ещё какого-то способа?
            Без constexpr так должно сработать.
            ExpandedWrap disabled
              #include <iostream>
               
              template<int N, int P> struct Power
              {
                  const static int value = Power<N, P - 1>::value * N;
              };
               
              template<int N> struct Power<N, 0>
              {
                  const static int value = 1;
              };
               
              int main()
              {
                  int a[Power<3, 4>::value];
                  std::cout << sizeof(a) / sizeof(int);
              }
              :blink: работает! Может так можно и статические массивы произвольной размерности делать?
                Цитата FateFlex @
                статические массивы произвольной размерности

                http://ru.cppreference.com/w/cpp/container/array
                но едва ли это есть в VS2010
                  Цитата FateFlex @
                  Может так можно и статические массивы произвольной размерности делать?

                  Что это за зверь такой? Power<3, 4>::value заменяется на константу во время компиляции, соответственно и размер массива ты можешь сделать таким, какой ты можешь сделать простым заданием его размера.
                    Цитата OpenGL @
                    Что это за зверь такой?

                    Видимо многомерные массивы. Типа int x[1][1][1];
                      имею ввиду многомерный массив, получается гиперкуб, размерностью 1 - число (например BYTE[1]), размерностью 2 - квадрат (например BYTE[2][2] A), размерностью 3 - куб (например BYTE[3][3][3] A), и так далее (например BYTE[N]...[N])...
                      некий шаблон многомерного массива/матрицы T с указанием типа и размерности (числа координат, осей):
                      ExpandedWrap disabled
                        T<BYTE,3> A;
                        A[0][1][2] = 1;
                        A[2][1][0] = 27;

                      Вообще можно это всё представить одномерным массивом и считать смещения, а было бы здорово просто обращаться по координатам (индексам).

                      Добавлено
                      Алексей_Л, в 2010 нет, но логику из поздних версий можно подсмотреть, спасибо за ссылку.
                      Сообщение отредактировано: FateFlex -
                        А, точно, размерность же, а не размер :D Да, конечно, её тоже можно сделать - написать шаблон вида template<class T, int N, int Dim> struct Array;, а затем специализировать следующим образом
                        1) Когда Dim = 1 это просто класс-враппер над обычным массивом, т.е. всякие operator[] для него будут возвращать T& / const T&
                        2) Для остальных случаев - в виде класса, operator[] которого возвращает ссылку на Array<T, N, Dim - 1>.
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0378 ]   [ 17 queries used ]   [ Generated: 19.03.24, 10:27 GMT ]