4

のオブジェクトを作成したいのですstd::array<T, N>が、問題は、型を返す関数しか使用できないconstexprか、コンパイラが文句を言うことです。ここでの問題は、次のような別の配列のサイズに基づいて、この配列の長さを計算する必要があることです。

template <typename T>
struct DataLength 
{
    template <typename iter>
    size_t maxPossibleLength(iter begin, iter end) 
    {
        size_t m_size = 0;
        while (begin != end) {
            m_size = m_size << 8 | std::numeric_limits<T>::max(); /* 0xff for uchar*/
            begin++;
        }
        return m_size;
    }
}

この関数の出力を変換して、代わりに使用できるようにするにはどうすればよいNですか?

4

1 に答える 1

4

これを再帰constexpr関数として記述し、元の配列の長さを計算できます。これもコンパイル時に行う必要があります。

問題は、関数 (私が正しく理解していれば) はイテレータをまったく取得する必要がないということです。長さ N が必要なので、次のようなことができます。

template<typename T>
constexpr size_t maxLength(size_t n, size_t m_size=0) {
    return n==0 ? m_size : maxLength<T>(n-1, m_size << 8 | std::numeric_limits<T>::max());
}

そしてそれは実行されます:

std::array<int, 15> a;
std::array<float, maxLength<int>(a.size())> b;
于 2014-10-23T19:31:57.747 に答える