C ++静态const数组初始化器

时间:2014-04-19 18:53:05

标签: c++ c++11

我有以下课程:

const unsigned E = 256;

class A {
    public:
        static const unsigned x[E];
    ...
}

我想按如下方式初始化x:

const unsigned A::x[E] = { 1, 2, 3, ..., E };

上述任务目前似乎微不足道。但是,关键是要根据索引初始化数组x的值。快速尝试似乎告诉我,即使使用c ++ 11,这也是不可能的。

任何输入?

感谢。

2 个答案:

答案 0 :(得分:2)

如果您不介意存储std::array而不是C数组,则使用整数序列非常简单:

template <int...I>
struct indices {};
template <int N, int...I>
struct make_indices : make_indices<N-1, N-1, I...> {};
template <int...I>
struct make_indices<0, I...> : indices<I...> {};

template <typename T, int...I>
constexpr std::array<T, sizeof...(I)>
iota_array_helper(indices<I...>) {
  return {I...};
}

template <typename T, std::size_t N>
constexpr std::array<T, N>
iota_array() {
  return iota_array_helper<T>(make_indices<N>());
}

你可以用作:

const unsigned E = 256;

class A {
    public:
        static const std::array<unsigned, E> x;
    ...
};

std::array<unsigned, E> A::x = iota_array<unsigned, E>();

Here it is live

答案 1 :(得分:0)

你可以用一些递归技巧

template<int... values>
struct myclass {
    static const unsigned char x[sizeof...(values)];
};

template<int... values>
const unsigned char myclass<values...>::x[sizeof...(values)] = { values... };

template<int count, int... values>
struct iota_array {
    typedef typename iota_array<count-1, count-1, values...>::value value;
};

template<int... values>
struct iota_array<0, values...> {
    typedef myclass<values...> value;
};

typename iota_array<E>::value myinstance;

事实上你当然并不意味着你应该这样做。