我正在寻找一种填充std::array<T, N>
的方法,其中T是一个非默认构造的结构/类,N确实在编译时已知,但是如此之大,以至于你不想对所有这些进行硬编码,例如N=256
。构造函数(在我的例子中),接受一个参数,它基本上等于N
,我想知道是否有办法获得一个constexpr std::array<T, 256> values
而不进入copy'n'paste地狱。
在动态构造unique_ptr
时,使用array<unique_ptr<T>, 256>
并创建所有元素会有一个解决方法。但这意味着我不能使用constexpr
,也不觉得这是最好的解决方案。
我正在提供我的问题的一般化(!)示例,我希望以这种方式工作。
#include <iostream>
#include <array>
using namespace std;
struct T { int value; }; // some struct/class with non-default ctor
// a workaround-attempt
template <const size_t N> struct TT : public T { constexpr TT(): T{N} {} };
template <const size_t N>
constexpr array<T, N> makeArray() {
return {
TT<1>{},
TT<2>{},
TT<3>{},
TT<4>{},
TT<5>{},
// too bad I can't place this generically
};
}
ostream& operator<<(ostream& os, T const& t) { return os << t.value; }
int main() {
constexpr T a = TT<4>{};
cout << a << "\n";
constexpr array<T, 5> v = makeArray<5>();
for (T const& t: v) cout << " " << t.value;
cout << "\n";
return 0;
}
这里应该很清楚,我目前正在通过不使用makeArray<5>()
来硬编码N
方法,但是明确地返回长度为5的数组(在我的代码中,不会是5而是256):-)。
我目前正在用C ++编写代码14(没有机会很快升级到c ++ 17),我知道在C ++ 20中改进了constexpr松弛,这不是(不幸的是):-)
如何在C ++ 14中消除它并使代码看起来更干净?
似乎std::make_index_sequence
/ std::index_sequence
的作品
template <std::size_t N, std::size_t ... Is>
constexpr array<T, N> makeArray (std::index_sequence<Is...>)
{ return { { TT<Is+1>{} ... } }; }
template <std::size_t N>
constexpr array<T, N> makeArray ()
{ return makeArray<N>(std::make_index_sequence<N>{}); }