std :: array <t,n =“”>具有复杂类型,N = 256 /大

时间:2019-03-26 13:59:04

标签: c++ arrays c++14 constexpr

我正在寻找一种填充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中看起来更干净?

1 个答案:

答案 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>{}); }