我可以传递 &std::array<> 作为 void* 吗?

Can I pass &std::array<> as a void*?

本文关键字:void 作为 gt lt std array 我可以      更新时间:2023-10-16

我有一些遗留的C代码,我用一个C++接口包装了这些代码,供新的C++代码使用。 C 代码使用 void* 从文件加载数据。 它知道根据您发送的枚举标签在内部加载多少数据:

bool load_data( TAG_TYPE tag, void* data );

我的C++包装器看起来像这样:

template<typename T>
T load( TAG_TYPE tag ) {
T data;
bool success = load_data( tag, &data );
assert( success );
return data;
}

这增加了一些类型安全性,并且对于C++代码来说更简洁。 我们可以使用 auto & const:

const auto foo = load<int>( TAG_NUM_POINTS );

现在有人需要从文件中加载一个数组。 他们想使用 std::array,因为这C++。

const auto foo = load<std::array<int, 3>>( TAG_RGB_VALUE );

这安全吗? 它似乎编译和运行良好。 在封面下,它将传递&std::array<int, 3>作为data值,而不是首选data.data()

这似乎是我想进行模板专用化的领域,但是我需要为 std::array 的类型和大小添加模板参数? 这可能吗,这是要走的路吗?

std::array<>中存在一个名为data()的方法。它允许您访问内部数据,而不必担心实施。您可以在此处阅读更多相关信息 https://en.cppreference.com/w/cpp/container/array/data

一个例子

bool load_data( TAG_TYPE tag, void* data );
template<typename T>
std::array<T> load( TAG_TYPE tag ) {
std::array<T> data;
bool success = load_data( tag, data.data() );
assert( success );
return data;
}