将 C 数组传递到需要“动态”C 数组的函数,而不定义变量

rid*_*ous 3 c++ arrays function parameter-passing

C 存在许多类似的问题,例如这个,但我正在寻找 C++ 中最简单、最易读的方法,将 C 数组传递到函数中,而无需先为其定义变量。

鉴于 void f(double const* a) 这些是不可能的(但第一个是在 C99 中):

f((double []){1,2}); // works in C
f({1,2}); // would be great but doesn't work in any language with C-arrays
Run Code Online (Sandbox Code Playgroud)

当然,首先定义变量总是可能的,但这不是我想要的:

double a[] = { 1.2, 3.4 };
f(a);
Run Code Online (Sandbox Code Playgroud)

但是,可以将事物包装到结构中,例如

struct A { double a[2]; };
f(A{2.3,4.5}.a);
Run Code Online (Sandbox Code Playgroud)

并且该类型可以重用,所以这已经是一个小小的胜利

现场演示

但这仍然感觉很笨拙。

有没有更简单、更易读的方法?采用现行标准之一还是即将出台的标准?

编辑:抱歉,我之前没有提到这一点;我无法更改目标 api。预计会出现一个指向 double 的指针。

Art*_*yer 6

这个函数非常适合:

template<typename T, std::size_t N>
constexpr T* temporary_array(T(&& arr)[N]) noexcept { return arr; }
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地调用f(temporary_array<double>({1,2}));(或f(temporary_array({1., 2.})))。

在 C++20 中,您可以编写f(std::type_identity_t<double(&&)[]>{1,2}). f(std::type_identity_t<double[]>{1, 2})也应该在任何 C++ 版本中工作,但 GCC 有一个长期存在的错误,不允许它编译。

寻找标准库解决方案,您struct A可以替换为std::array<double, 2>. 写出大小参数很烦人,但可以用 CTAD 代替:

f(std::array{ 1., 2. }.data());
f(std::array<double, 2>{1, 2}.data());
// (These will call move constructors)
f(std::to_array<double>({1, 2}).data());
f(std::to_array({1., 2.}).data());
Run Code Online (Sandbox Code Playgroud)