如何通过一行中的指针构造一个点

How to construct a point by a pointer in one line?

本文关键字:一个 指针 何通过 一行      更新时间:2023-10-16

我有一个接受双指针的 Point 构造函数。我这样做如下

Point::Point(double* p)
   : mX(p[0]), mY(p[1]), mZ(p[2])
{}
Point pt( []() -> double* {double p[3] = {1, 2, 3}; return p;}() );

有什么更简单的方法可以在一行中构造具有指定值的指针?

最简单的方法是声明一个本地数组并传递指向该数组的指针:

double p[3] = {1, 2, 3};
Point pt(p);

或者,考虑编写一个新的构造函数,以便直接传递三个坐标:

Point::Point(double x, double y, double z)
    : mX(x), mY(y), mZ(z)
{ }

如果无法添加构造函数,则可以使用工厂:

Point make_point(double x, double y, double z)
{
    double p[3] = { x, y, z };
    return Point(p);
}

[编辑] 这会在堆栈上创建临时数组,因此它将比其他两个选项快得多,它们涉及内存分配(new/delete):

Point pt( &(double[3]){1, 2, 3}[0] );

为了避免内存泄漏并实际返回指针,您必须使其更长:

Point pt( std::unique_ptr<double>(
    []() -> double* { return new double[3]{1, 2, 3}; }()
    ).get() );

另一种选择:

Point pt( std::vector<double>{1,2,3}.data() );

您的代码不起作用:从 lambda 函数返回的数组在从 lambda 返回后但在将其传递给您想要查看它的构造函数之前被销毁。代码可能看起来有效,但这只是未定义行为的最坏情况。

就个人而言,我认为您应该考虑更好的界面。如果您无法更改界面,则可能需要使用如下内容:

typedef double array[3];
Point pt(&(array{ 1.2, 2.3, 3.4 })[0]);