我正在寻找一种填充std::array<T, N>
的方法,其中T是不可默认构造的结构/类,而N在编译时确实是已知的,但是它太大了,以至于您不想要-对所有代码进行编码,例如N=256
。构造函数(以我为例)采用一个参数,该参数基本上等于N
,我想知道是否有一种方法可以得到constexpr std::array<T, 256> values
而不会陷入复制粘贴的地狱。
使用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中看起来更干净?
答案 0 :(得分:3)
似乎是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>{}); }