c++ - 将 vector 传递给某些需要某种大小的数组引用的遗留 API 的任何方法

标签 c++ arrays c++11 vector

背景 我正在使用 GCC、C++11。 假设我有一个用公共(public)值初始化的 vector ,让我们从

开始
uint64_t val = 100;
std::vector<uint64_t> vect(2, val);

通常,当我处理需要指向某些数据的指针的接口(interface)(遗留工作 API)时,我通过传入函数来传递底层数据数组

function_name ( &vect[0] );

我认为 vector 有一个 vector::data 方法也可以做到这一点(我认为)。

但是我遇到了一个奇怪的错误,我不确定如何处理(不确定如何正确地转换或正确传递这个 vector - 假设它是完全可能的)。

这里是编译错误。

cannot convert '& vect.std::vector<_Tp, _Alloc>::operator[]<long unsigned 
int, std::allocator<long unsigned int> >(0ul)' (type 
'__gnu_cxx::__alloc_traits<std::allocator<long unsigned int> 
>::value_type* {aka long unsigned int*}') to type 'long unsigned int (&)
[2]'

我试图向它传递一个指针(在某种意义上),但它实际上期望引用一个大小为 2 的数组。我尝试以多种形式的猜测和检查(不'判断我......)

&vect[0]
static_cast<uint64_t(&)[2]>(&vect[0])
// same w/dynamic and reinterpret cast (yes I know it ...not the best idea)

所以我可以通过创建一个数组并使用 memcpy 复制数据来解决这个问题(我的工作只支持某些标准函数,因为我们没有整个标准库可供我们使用......这意味着没有 std::copy等)。

uint64_t myArray[2] = {};
memset( &myArray, &val, sizeof(myArray) );

我可以将它传递给某个函数,它会愉快而正确地传递(据我的测试打印输出来看)。

是否有任何其他方法可以将我的 vector 传入或安全地转换为某个函数来清除此编译器错误?我很恼火,因为我必须创建另一个变量并将内容复制过来...希望尽可能避免这种情况。

根据要求,这是我能从 API 签名中看到的最接近的,因为它是专有的

Id 是一个枚举。

template<typename T> inline void function_name(Id id, T&) {}

最佳答案

template<class T, std::size_t N>
using arr = T(&)[N];

template<std::size_t N, class T>
arr<T,N> as_array( T* t ) {
  return *reinterpret_cast<T(*)[N]>(t);
}

这是我最好的尝试。

some_func( as_array<2>(vec.data()) );
some_func( as_array<2>(vec.data()+2) );

您知道数据的布局类似于数组。

上面的代码隐藏了某种程度上类型安全的外观背后的重新解释,因为它不会强制您键入 T 并使其正确或以意想不到的方式破坏程序。您只需负责使 N 正确。

Live example .

关于c++ - 将 vector 传递给某些需要某种大小的数组引用的遗留 API 的任何方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36647870/

相关文章:

c++ - std::copy 3维数组到3维 vector

java - 对对象的字段进行快速排序

c - 如何获得指针指向的二维数组的宽度/高度?

c++ - std::lock_guard 不会解锁

python 将整数传递给 C++ 64 位库 : varying sizes

c++ - 创建以 C (MFC) 格式化的字符串

c++ - 如何在默认桌面和 Winlogon 桌面之间切换进程?

c++ - 课外计时器

c++ - C++11 中::new 的线程安全

c++ - 在 C++ 中使用内联函数的未指定输出