gsl::span是一段记忆的视图。
foo
是一个模板函数,可以接受可变跨度和不可变跨度。
我希望foo
中的代码始终只能对片段内存进行不可变的访问。
#include <gsl/gsl> // gsl-lite
template <typename T>
void foo(gsl::span<const T> x) {}
int main() {
int arr[] = {0, 1, 2, 3, 4};
auto s1 = gsl::span<int>(arr);
foo(s1);
}
这不起作用,因为在模板实例化期间没有类型转换。
如果我写下以下内容:
template <typename T>
void foo(gsl::span<T> x) {}
在foo
内,x
可以是可变范围。
此用例的正确解决方法是什么?
答案 0 :(得分:1)
gsl::span<const T>
让构造函数接受gsl::span<T>
。所以你只是&#34;只是&#34;有模板扣除的问题。
您有多种方法可以解决您的问题:
在呼叫站点明确:
foo<int>(arr)
foo(gsl::span<const int>(arr))
写入重载:
template <typename T>
void foo(gsl::span<const T> arr) { /* Your implementation */ }
template <typename T>
void foo(gsl::span<T> arr) { foo(gsl::span<const T>(arr)); }
将助手函数编写为在调用站点不太明确,例如:
template <typename T>
span<const T> as_immutable_view(span<T> s) { return s; }
然后致电foo(as_immutable_view(arr))
答案 1 :(得分:1)
如何从参数中创建变量的const版本?
Activity