Проблема метапрограммирования с помощью Enums - PullRequest
0 голосов
/ 30 августа 2011

Atm У меня есть что-то вроде этого:

template<int n>
struct Pow
{
  enum{val= Pow<n-1>::val<<1};
};
template<>
struct Pow<0>{
    enum{val =1};
};

Я могу получить доступ к таким данным, как Pow <30> :: val.Это хорошо, но я хочу сделать вот так

   int main()
    {
    Pow<30>::val;

, а затем использовать переменную для доступа ко всем значениям <0,30> Я знал, что могу использовать массив и динамическое программирование, но могу ли я сделать это таким образом?Извините за английский.

Ответы [ 2 ]

1 голос
/ 30 августа 2011

Использование C ++ 0x шаблонов переменных:

template<int... Indices>
struct powers {
    static const int value[sizeof...(Indices)];

    typedef powers<Indices..., sizeof...(Indices)> next;
};

template<int... Indices>
const int powers<Indices...>::value[sizeof...(Indices)] = { Pow<Indices>::val... };

template<int N>
struct build_powers {
    typedef typename build_powers<N - 1>::type::next type;
};

template<>
struct build_powers<1> {
    typedef powers<0> type;
};

и затем:

int
main()
{
    // we want [0..30] inclusive so pass 31 as exclusive upper limit
    typedef build_powers<31>::type power_type;
    // 0..30 is 31 powers in all
    typedef const int array_type[31];

    array_type& ref = power_type::value;
    // ref[0] .. ref[30] are the values of Pow<0>::val .. Pow<30>::val
}

Так что с использованием массива, но без динамической инициализацииПоскольку вы хотите получить результат как переменную, а не для TMP, я считаю, что этого достаточно.

1 голос
/ 30 августа 2011

Когда вы делаете Pow<30>::val;, вы создаете экземпляр верха ваших двух шаблонов, затем, когда он достигает нуля, он создает экземпляр специализации, и только конечный результат будет виден в время выполнения , поскольку шаблоны разрешаются в время компиляции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...