如何编写C++函数模板返回包含传入参数的同类型原生数组
错误原因
- C++ 语法不允许函数直接返回原生数组类型,原生数组作为返回值时会自动退化为对应元素类型的指针。你原代码中的函数甚至没有写返回值语句,
auto无法推导返回类型,即使补充返回语句,返回的指针也无法用于初始化原生数组。 - 原生数组只能用大括号包裹的初始化列表完成初始化,不支持直接用函数返回值做整体初始化,这就是你收到
array must be initialized with a brace-enclosed initializer报错的直接原因。
解决方案
方案1:输出参数实现(最稳妥,无额外依赖)
直接将目标数组作为引用参数传入函数赋值,完全使用原生数组语法,不引入任何标准库容器:
template<typename T> void encArr(T obj, T (&out_arr)[1]) { out_arr[0] = obj; }
调用示例:
int test_val = 10; int arr[1]; encArr(test_val, arr); // 此时arr[0]已被赋值为10
方案2:结构体包装返回(支持返回值形式调用)
将原生数组包裹在可值返回的结构体中,保留返回值调用的习惯:
template<typename T> struct ArrayWrap { T data[1]; }; template<typename T> ArrayWrap<T> encArr(T obj) { return {{obj}}; }
调用示例:
int test_val = 10; // 直接用返回值初始化数组 int arr[1] = {encArr(test_val).data[0]}; // C++17及以上版本可直接用结构化绑定拿到原生数组 auto [res_arr] = encArr(test_val); // res_arr 就是类型为int[1]的原生数组,res_arr[0] = 10
内容的提问来源于stack exchange,提问作者Anton Adamson
相关产品推荐
相关产品推荐

