阅读范围从 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
因为 start
和 end
是运行时值。如果您确实需要静态保证,则需要将它们设为模板参数,否则您可以使用运行时断言进行调试模式或执行检查并抛出异常。
如何接受可能具有不同维度的 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
因为 start
和 end
是运行时值。如果您确实需要静态保证,则需要将它们设为模板参数,否则您可以使用运行时断言进行调试模式或执行检查并抛出异常。