gpt4 book ai didi

c++ - 具有复杂类型且 N=256/large 的 std::array

转载 作者:行者123 更新时间:2023-11-30 02:16:08 25 4
gpt4 key购买 nike

<分区>

我正在寻找一种方法来填充 std::array<T, N> T 是一个非默认可构造的结构/类,而 N 在编译时确实是已知的,但太大了,你不想对所有它们进行硬编码,例如 N=256 .构造函数(在我的例子中)接受一个参数,基本上等于 N ,我想知道是否有办法获得 constexpr std::array<T, 256> values无需进入复制'粘贴' hell 。

使用 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),并且我知道 constexpr 放宽在 C++20 中得到了改进,但这里也没有(不幸的是): -)

我怎样才能消除它并使代码在 C++14 中看起来更干净?

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com