对于C,e,存在许多类似的问题。例如this one,但我正在寻找C++中最简单和最可读的方法来将C数组传递到函数中,而无需首先为其定义变量。
给定void f(double const* a)
,这些是不可能的(但the first one is in C99):
f((double []){1,2}); // works in C
f({1,2}); // would be great but doesn't work in any language with C-arrays
当然首先定义一个变量总是可能的,但这不是我要找的:
double a[] = { 1.2, 3.4 };
f(a);
但是,可以将东西 Package 到结构体f中。即喜欢
struct A { double a[2]; };
f(A{2.3,4.5}.a);
而且这种类型可以重用,所以这已经是一个小胜利了
Live Demo
但还是觉得很笨拙
有没有更简单、更易读的方法?在当前的标准之一或即将到来的标准中?
编辑:对不起,我之前没有提到;我无法更改目标API。需要指向双精度型的指针。
5条答案
按热度按时间vulvrdjw1#
这个函数很棒:
然后,您可以简单地调用
f(temporary_array<double>({1,2}));
(或f(temporary_array({1., 2.}))
)。在C20中,你可以写
f(std::type_identity_t<double(&&)[]>{1,2})
。f(std::type_identity_t<double[]>{1, 2})
也应该在任何C版本中工作,但GCC有一个长期存在的错误,不允许编译。寻找标准库解决方案,您的
struct A
可以替换为std::array<double, 2>
。写出size参数很烦人,但可以用CTAD代替:xj3cbfub2#
用
vector
代替double*
怎么样?然后你可以在调用站点构建一个in-place,如下所示:xkrw2x1b3#
如果你能用c++20编译,那么最明显的答案是使用std::span,以获得最大的灵活性。
Demo:
68bkxrlz4#
如果要避免动态分配,请使用
std::initializer_list
产出
Live example
bxfogqkk5#
你的函数签名是错误的。它可以被修复和改进。参见:https://godbolt.org/z/WoME5xazr
希望能帮上忙