массив силы 2s с использованием шаблона в c ++ - PullRequest
3 голосов
/ 02 марта 2012

Можем ли мы создать следующий массив или нечто подобное, используя template в c ++ во время компиляции.

int powerOf2 [] = {1,2,4,8,16,32,64,128,256}

Это самое близкое, что у меня есть.

template <int Y> struct PowerArray{enum { value=2* PowerArray<Y-1>::value };};

но затем для использования мне нужно что-то вроде PowerArray , который компилятор выдает ошибку, поскольку я является динамической переменной

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Для этого можно использовать BOOST_PP_ENUM:

#include <iostream>
#include <cmath>
#include <boost/preprocessor/repetition/enum.hpp>

#define ORDER(z, n, text) std::pow(z,n)

int main() {
  int const a[] = { BOOST_PP_ENUM(10, ORDER, ~) };
  std::size_t const n = sizeof(a)/sizeof(int);
  for(std::size_t i = 0 ; i != n ; ++i ) 
    std::cout << a[i] << "\n";
  return 0;
}

Вывод ideone :

1
2
4
8
16
32
64
128
256
512

Этот пример является модифицированной версией (в соответствии с вашими потребностями)) из этого:

0 голосов
/ 02 марта 2012

Ничего не против использования BOOST_PP_ENUM, но я думаю, что вы собираетесь использовать больше кода, который я вам покажу.

Что бы я сделал, я бы сделал конструктор класса вашего типа, который просто устанавливает массив для того, что вам нужно. Таким образом, он делает это, как только программа собирается, и она остается красивой и аккуратной. Ака правильный путь.

     class Power
    {
    public:
         Power();
         void Output();
         // Insert other functions here
    private:
         int powArray[10];
    };

Тогда реализация будет с базовым циклом for для загрузки их в массив, который вы только что создали.

Power::Power()
{
    for(int i=0;i<10;i++){
         powArray[i] = pow(2,i);
    }
}
void Power::Output()
{
     for(int i=0;i<10;i++){
          cout<<powArray[i]<<endl;
     }
}

Надеется, что это поможет ...

...