从std :: array读取范围

时间:2015-11-19 08:43:56

标签: c++ templates stdarray

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

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

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

3 个答案:

答案 0 :(得分:1)

你有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 == nstartend为运行时值。如果您确实需要静态保证,则需要将它们作为模板参数,否则可以使用运行时断言进行调试模式或执行检查并抛出异常。

答案 1 :(得分:0)

您需要模拟size参数,就像您一样。除非您已经交换了std::array的模板参数的顺序,这就是为什么它不起作用。

答案 2 :(得分:0)

此类代码编译时,您应使用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);
}

如果n总是等于end,那么您可以在n内使用read_interval作为普通常量。