如何使span<auto>模板函数无需辅助函数,调用点自动推导元素类型
解决无需辅助函数直接调用span模板函数的问题
你的辅助函数h完全是多余的——直接调用f(a)、f(b)就能正常工作,C++20的std::span原生支持从内置数组、std::array、std::vector等连续容器隐式构造,模板参数会自动推导,根本不需要额外转发。
简化后的代码如下:
#include <iostream> #include <span> #include <array> #include <vector> using namespace std; void f(span<auto> s) { for(auto &a : s) cout << a << endl; } int main() { int a[]{5, 6}; auto b = array{7, 9, 3, 1}; f(a); // 直接传内置数组,正常推导 f(b); // 直接传std::array,正常推导 f(vector{10, 20, 30}); // 还支持直接传std::vector }
如果你想支持直接传递初始化列表(比如f({1,2,3})),由于std::span不能直接绑定到初始化列表的临时数据(它不管理内存),可以给f加一个重载:
template<typename T> void f(initializer_list<T> il) { vector<T> temp(il); // 先把初始化列表转成vector(产生一次拷贝) f(span(temp)); }
这样就能直接调用f({1,2,3})。如果不想产生拷贝,更高效的方式是显式用std::array构造后传递:f(array{1,2,3}),原有的f就能直接处理。
另外注意:你提到的f({a})这种写法没有实际意义——它会把数组a当作单个元素传递给span,此时span的元素类型变成int[2],完全达不到遍历数组元素的目的,正确用法就是直接传递数组或容器本身。
内容的提问来源于stack exchange,提问作者ByteEater
相关产品推荐
相关产品推荐

