的std ::阵列 复杂类型,N = 256 /大[重复]

问题描述 投票:1回答:1

我正在寻找一种填充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中消除它并使代码看起来更干净?

c++ arrays c++14 constexpr
1个回答
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>{}); }
© www.soinside.com 2019 - 2024. All rights reserved.