Статические массивы во время компиляции в C ++ - PullRequest
2 голосов
/ 25 августа 2011

Мне было интересно, возможно ли сделать следующий ответ более общим, в том смысле, что тип массива должен быть шаблонным, а не просто беззнаковым:

Я заключил все это в структуру примерно так:

template<typename ArrayType>
struct Array
{
template<ArrayType... args> struct ArrayHolder {
    static const ArrayType data[sizeof...(args)];
};

template<ArrayType... args> 
const ArrayType ArrayHolder<args...>::data[sizeof...(args)] = { args... };

template<size_t N, template<size_t> class F, ArrayType... args> 
struct generate_array_impl {
    typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;
};

template<template<size_t> class F, ArrayType... args> 
struct generate_array_impl<0, F, args...> {
    typedef ArrayHolder<F<0>::value, args...> result;
};

template<size_t N, template<size_t> class F> 
struct generate_array {
    typedef typename generate_array_impl<N-1, F>::result result;
};
};

но я получаю следующие ошибки:

c++-4.6 -std=c++0x -o test test.cpp
test.cpp:49:17: error: specializing member ‘Array<ArrayType>::ArrayHolder<args>::data’ requires ‘template<>’ syntax

Ответы [ 3 ]

8 голосов
/ 25 августа 2011

Это помогает, если вы делаете отступ в структуре.Проблема в том, что вы определяете статическую переменную-член данных внутри структуры Array.Но это должно быть в области имен:

template<typename ArrayType>
struct Array
{
    template<ArrayType... args> struct ArrayHolder {
        static const ArrayType data[sizeof...(args)];
    };

    template<size_t N, template<size_t> class F, ArrayType... args> 
        struct generate_array_impl {
            typedef typename generate_array_impl<N-1, F, F<N>::value, args...>::result result;
        };

    template<template<size_t> class F, ArrayType... args> 
        struct generate_array_impl<0, F, args...> {
            typedef ArrayHolder<F<0>::value, args...> result;
        };

    template<size_t N, template<size_t> class F> 
        struct generate_array {
            typedef typename generate_array_impl<N-1, F>::result result;
        };
};

template<typename ArrayType> template<ArrayType... args> 
        const ArrayType Array<ArrayType>::ArrayHolder<args...>::data[sizeof...(args)] = { args... };
0 голосов
/ 25 августа 2011

Я не думаю, что выражение типа 'template' является допустимым использованием вариадических шаблонов C ++ 11.

Насколько я понимаю, оно может быть двух форм:

  1. template <typename... args>: переменное число параметров универсального типа
  2. template <int... args>: переменное число целочисленных (нетиповых) параметров

См. эту статью в Википедии для вариационных шаблонов.

0 голосов
/ 25 августа 2011

Эмм ... Почему бы вам просто не использовать std :: vector?Или, если вы хотите массив non-resiable, тогда используйте эквивалентный тип в boost?

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