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 回答