如何将值直接传递给std::span?

  • 本文关键字:std span c++ c++20
  • 更新时间 :
  • 英文 :


我有一个接收span的函数。

void p(std::span<int> s) {
for(auto x : s) {
std::cout << x << ' ';
}

如何将值直接传递到函数中?例如,

p({1,2,3})

解决方案吗?

您可以构建一个std::array:

p(std::array{1,2,3});

这也要求您使用std::span<const int>而不是std::span<int>,因为后者期望可修改范围(这似乎不是你的意图),并拒绝右值。


p({{1,2,3}});也可以。

最接近于通过{1, 2, 3}的是通过std::initializer_list:

auto list = { 1, 2, 3 };
p(list);

或内联:

p( std::initializer_list{ 1, 2, 3 } );

但是无论你采取跨度,p需要接受std::span<const int>工作,就像HolyBlackCat提到的…

您可以通过提供自己的适配器来缩短在{}之前需要编写的内容。例如:

#include <iostream>
#include <span>
void p(std::span<const int> s) {
for(auto x : s) {
std::cout << x << ' ';
}
}
template<typename T>
class spn
{
public:
spn(std::initializer_list<T> list) : span_(list) {}
operator std::span<const T>() {
return span_;
}
private:
std::span<const T> span_;
};
int main()
{
p(spn{1,2,3});
return 0;
}

最新更新