从 std::vector 到指向数组的指针(大多数 C++ 风格的解决方案)

问题描述 投票:0回答:1

在我正在编写的 C++ 应用程序中,在某些时候,我必须与 C API 交互并调用签名为 的函数

int foo(const double(*bar)[3], const int N) 

我的

bar
是一个
std::vector<double>
,其大小是3的倍数。此设计是应用程序其他部分所需的,无法更改。因此,为了将
bar
从我的源代码传递到
foo
,我安排了以下 C 风格的解决方案:

auto bar = std::vector<double>(3 * N); // for some int N known only at runtime
// a lot of code that uses bar
// ...
// Call to C function "foo"
auto *bar_p = bar.data()
int result = foo((double(*)[3])(&bar_p), N)

它编译了,但让 complain 关于使用 C 风格数组变得整洁。我也尝试了一些

static_cast
解决方案,但编译器不接受它们。此外,当我尝试使用 reinterpret_cast 时,clang-tidy 也
抱怨

bar
传递给
foo
的假定/规范/最佳/“正确”C++ 方式是什么?

附注:C++17 或更高版本

c++ arrays pointers stdvector
1个回答
0
投票

你需要

reinterpret_cast
:

#include <vector>
#include <iostream>
#include <random>

int foo(const double (*bar)[3], const int N) {
    // Example implementation to demonstrate access
    for (int i = 0; i < N; ++i) {
        std::cout << bar[i][0] << " " << bar[i][1] << " " << bar[i][2] << "\n";
    }
    return 0; // Dummy return
}

void callFoo(int n) {
    // Create a vector large enough for N arrays of 3 doubles
    auto bar = std::vector<double>(3 * n);

    // Fill with some data (optional)
    for (int i = 0; i < 3 * n; ++i) {
        bar[i] = static_cast<double>(i);
    }

    // Convert bar.data() to double(*)[3]
    auto *bar_p = reinterpret_cast<const double(*)[3]>(bar.data());

    // Call foo
    int result = foo(bar_p, n);
    std::cout << "result = " << result << std::endl;
}

int main()
{
    std::random_device rd;  
    std::mt19937 gen(rd()); 

    // Define the range [5, 10]
    std::uniform_int_distribution<> distrib(5, 10);
    callFoo(distrib(gen));
}

https://godbolt.org/z/b4xv4GsWT

© www.soinside.com 2019 - 2024. All rights reserved.