我正在寻找一种方法来在编译时使用值元素填充数组,而不是运行时。所以我正在寻找的是这样的
#define numbar
Bar foo[] = {Bar(0),Bar(1)....Bar(numbar)}
c ++有没有办法做到这一点?也许使用宏或类似的东西?
答案 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);
通常,您可以通过这种方式解决许多重复性问题,但是您经常会使代码更复杂,并且不太明显会发生什么。因此,只有当你有很多这样的想法时,你才应该这样做。 当然你也可以做一些元编程,这会导致很长的编译时间