【问题标题】:creating an std::array with size calculated during run time创建一个在运行时计算大小的 std::array
【发布时间】:2014-12-19 12:53:37
【问题描述】:

我想创建一个std::array<T, N> 的对象,但问题是我只能使用返回constexprtype 的函数,否则编译器会报错。这里的问题是我需要根据另一个数组的大小来计算这个数组的长度,可能是这样的:

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

【问题讨论】:

  • std::array 的大小必须在编译时知道。运行时大小的数组是std::vector
  • 作为 T.C.说,你的问题的答案是“你不能创建一个在运行时计算大小的std::array。”您可以使用std::vector,也可以向我们提供有关您尝试解决的问题的更多信息,以便我们提出替代方法。
  • 最好能说明投反对票的原因。我的问题没有问题,问题在于 C++ 语言功能。
  • 实际的问题是为什么没有办法制作一个恒定长度的vector。这是一个很好的问题,但无法在 SO 中回答。
  • @Elazar 我不知道这是不可能的。如果我知道我一开始就不会问它。

标签: c++ c++11 constexpr stdarray


【解决方案1】:

你可以把它写成递归的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;

【讨论】:

  • 我没明白你的意思,你能举个例子吗?
  • 这并不重要。随心所欲。
  • 编译器抱怨n 的值没有用常量表达式初始化。我的意思是我不能用maxLength(some_array.size()) 调用这个函数。
  • 你的回答没有解决我的问题,但我学到了一种新技术,它在 constexpr 函数中使用递归。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2017-07-29
  • 2022-06-10
  • 2018-09-11
相关资源
最近更新 更多