编写模板函数,接受可变跨度作为不可变跨度

时间:2018-04-18 21:24:29

标签: c++

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可以是可变范围。

此用例的正确解决方法是什么?

2 个答案:

答案 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