在我正在编写的 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 或更高版本
你需要
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));
}