【问题标题】:Function template which returns a function parameter inside an array在数组中返回函数参数的函数模板
【发布时间】:2021-10-29 15:30:45
【问题描述】:

我正在尝试创建一个函数模板,它返回包含在它自己类型的数组中的给定参数:

template<typename T>
auto encArr(T obj){T arr[1] = {obj};} // For instance - if obj is an integer it should return
                                      // int arr[1] = {obj};
                                      // In general, it should return
                                      // T arr[1] = {obj};

但是当我尝试使用该函数时,我的编译器会反击:

int test = 10;
int test[1] = encArr(huh);            // error: array must be initialized with a brace-enclosed initializer

也许我只是以错误的方式解决这个问题。然而,我没有使用 std::vector 非常重要,我想使用标准 C++ 数组。非常感谢您的帮助!

【问题讨论】:

  • 你不能。可以做的事情:使用std::array&lt;int, 1&gt;,像使用一个元素的数组一样使用[&amp;test, &amp;test + 1),直接使用数组初始化器并跳过该函数。

标签: c++ arrays function templates


【解决方案1】:

首先,您的示例缺少return 语句。

但是,无论如何,您根本不能return 一个C 风格的平面数组。但是,如果您不想使用 std::vector,则可以返回 C++ 风格的 std::array

#include <array>

template<typename T>
auto encArr(const T &obj){
    return std::array<T, 1>{obj};
}
auto test = encArr(10);
// use test[0] as needed...

Online Demo

【讨论】:

  • 我同意这个解决方案。以“C”样式定义的数组,因此 int A[10];不能由函数返回。由于 C++11 有 std::array (固定长度)和 std::vector (在运行时改变长度)。它们可以返回,可以通过值或引用传递,IMO 使代码更加稳定、可预测和可读。我认为问题之一是人们仍然像 98 年那样学习 C++。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 2013-08-02
相关资源
最近更新 更多