【发布时间】:2019-03-26 22:41:52
【问题描述】:
我正在寻找一种方法来填充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 中的代码看起来更干净?
【问题讨论】:
标签: c++ arrays c++14 constexpr