阅读范围从 std::array

Reading range from std::array

如何接受可能具有不同维度的 std::array?这在编译时应该是已知的,但以下将不起作用

template<int n>
void read_interval(size_t start, size_t end, std::array<n, char>& dest)

我也知道 end-start == n 所以也可能以某种方式模板化。

您需要像您一样对大小参数进行模板化。除非你交换了 std::array 的模板参数的顺序,这就是它不起作用的原因。

这样的代码编译,你应该使用size_t而不是int作为模板参数

#include <array>

template<size_t n>
void read_interval(size_t start, size_t end, std::array<char, n>& dest)
{
}

int main()
{
    std::array<char, 10> arr1;

    read_interval(0, 10, arr1);

    std::array<char, 8> arr2;

    read_interval(0, 8, arr2);
}

end 如果 n 总是等于 end 你可以在 read_interval 中使用 n 作为普通常量。

std::array 的模板参数用错了,非类型参数是 std::size_t,而不是 int:

template<std::size_t n>
void read_interval(size_t start, size_t end, std::array<char,n>& dest)
{
    //...
}

您不能静态地确保 end - start == n 因为 startend 是运行时值。如果您确实需要静态保证,则需要将它们设为模板参数,否则您可以使用运行时断言进行调试模式或执行检查并抛出异常。