c ++以巧妙的方式使用预定义的值填充数组

时间:2014-10-23 09:05:31

标签: c++ arrays

我正在寻找一种方法来在编译时使用值元素填充数组,而不是运行时。所以我正在寻找的是这样的

#define numbar
Bar foo[] = {Bar(0),Bar(1)....Bar(numbar)}

c ++有没有办法做到这一点?也许使用宏或类似的东西?

2 个答案:

答案 0 :(得分:5)

假设c ++ 14:

constexpr auto num_bars = 100;

class Bar {
    constexpr Bar(int i);
};

template <std::size_t ...I>
constexpr auto generate_bars_impl(std::index_sequence<I...>) {
    return {Bar(I)...};
}

template <std::size_t N, typename Indices = std::make_index_sequence<N>>
constexpr auto generate_bars() {
   return generate_bars_impl(Indices());
}

constexpr auto generated = generate_bars<num_bars>();

这将为您提供C ++ 14中的std :: initializer_list。 C ++ 11:你应该实现index_sequence,我认为initializer_list没有constexpr构造函数。

答案 1 :(得分:3)

我不确定这是否足够聪明,但是如果你可以使用boost预处理器来创建代码,如你所示:

#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/seq/enum.hpp>

#define INIT(z, n, initializer)(initializer(n))
#define INIT_ARRAY(N, INITIALIZER) {BOOST_PP_SEQ_ENUM(BOOST_PP_REPEAT(5, INIT, Bar))}

struct Bar
{
    constexpr Bar(int ii) : i(ii) {}
    int i;
};

Bar data[] = INIT_ARRAY(5, Bar);

通常,您可以通过这种方式解决许多重复性问题,但是您经常会使代码更复杂,并且不太明显会发生什么。因此,只有当你有很多这样的想法时,你才应该这样做。 当然你也可以做一些元编程,这会导致很长的编译时间