我有一个接收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;
}